librmdp 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MjdkMTlkOGQ3YjY5ZDliNWYyYWIzNTA2NzE4ZDhlYzVlYTI5ZTFmYw==
5
- data.tar.gz: !binary |-
6
- MzA0NGMwODViMDU3YTM2MmQwYzEzNjk5Yzk4YTlhYWE2Mzg5MzBkMQ==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- ZjFjN2ZlMjY5NjljYjE0ZDdkYWYxYjIzNWZiNmVmNDIyNDEwOGUxZWUxMzUw
10
- YzFkMTk2NmE5MjA2YTU1NjIyZjU5OTMwZGQ5NDgyMzYwYjllOWVlNjE5Yjhj
11
- YmJjNjVmZWI5Nzk2MmQxNDNhNGRjNDIzYjQ0ZDM2MjA0MmIwYmE=
12
- data.tar.gz: !binary |-
13
- OTkyMTNmMDgyNjg1MDAyNzFiZDA4NjU2NjhkMWM5ODA4ZTY1ZTAxMDdhOTI3
14
- OTM0MTQxM2M3OGQ4ZGEyNjVhMjBlOGExMzg1ZjViYWQ5ZWMyMzAzNGFmOWI1
15
- OWUxMTI1OThkMTljNWE3YWIxYWYwNDc5Y2Y0Mjk5OTE3ZWU4NmY=
2
+ SHA1:
3
+ metadata.gz: 39d2a5d3842164319cbf4dff19d01933352d3629
4
+ data.tar.gz: f70b5f0e6451edef4dba01083896071b1e09bdc1
5
+ SHA512:
6
+ metadata.gz: 4babd79540a49f9a7299d91342e1bcdbaa00aefe56427e7f6bd5d69e4baaf2f6386890c0f31b2c735e4f7e8e046951fac5d1f5eb5b3a7868ddd3e5bcbcfabcfe
7
+ data.tar.gz: 4c7283d196714c0d8f831bed90778c580439e400b9df77e7def2d31baf471eac3be208023bb382de4bb0b5a83cf3b35c9febfffd4dc0515f9c4a3abfe021c48b
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
18
  .idea
19
+ log/
data/Gemfile CHANGED
@@ -4,3 +4,4 @@ gem 'minitest'
4
4
  gem 'simplecov', :require => false, :group => :test
5
5
  # Specify your gem's dependencies in librmdp.gemspec
6
6
  gemspec
7
+ gem 'rack'
data/README.md CHANGED
@@ -30,7 +30,7 @@ Start a broker
30
30
  Build a worker with 'echo' as service name
31
31
  ==========================================
32
32
 
33
- worker = Majordomo::Worker.new('tcp://0.0.0.0:5555', 'echo')
33
+ worker = Majordomo::Worker.new(Majordomo::Config.new, 'echo')
34
34
 
35
35
  loop do
36
36
  request = worker.receive_message(reply_to = '')
@@ -40,7 +40,7 @@ Build a worker with 'echo' as service name
40
40
 
41
41
  Build a client
42
42
  ==============
43
- client = Majordomo::Client.new('tcp://0.0.0.0:5555')
43
+ client = Majordomo::AsyncClient.new(Majordomo::Config.new)
44
44
  client.send_message('echo', 'a')
45
45
 
46
46
  response = client.receive_message
@@ -0,0 +1,4 @@
1
+ require 'librmdp'
2
+
3
+ config = Majordomo::Config.new
4
+ Majordomo::Broker.new(config).mediate
@@ -0,0 +1,27 @@
1
+ require 'librmdp'
2
+
3
+ context = ZMQ::Context.new
4
+
5
+ requests = 1
6
+ threads = 1
7
+
8
+ start = Time.now
9
+ p 'Sending message'
10
+ threads.times.collect do
11
+ Thread.new do
12
+ client = Majordomo::AsyncClient.new(Majordomo::Config.new, context)
13
+ requests.times do |i|
14
+ client.send_message('blaat', 'echo')
15
+ client.send_message('mmi.service', 'list-services')
16
+
17
+ begin
18
+ puts JSON.parse(client.receive_message(10).first)
19
+ rescue Majordomo::Timeout
20
+ p "Timeout #{i}"
21
+ end
22
+ end
23
+ end
24
+ end.map(&:join)
25
+
26
+
27
+ puts (Time.now - start) / (threads*requests)
@@ -1,10 +1,15 @@
1
1
  require 'ffi-rzmq'
2
2
  require 'majordomo/version'
3
+ require 'active_support/all'
4
+ require 'yaml'
5
+ require 'json'
3
6
 
4
7
  module Majordomo
5
8
  CLIENT = 'MDPC01'
6
9
  WORKER = 'MDPW01'
7
10
 
11
+ Timeout = Class.new(StandardError)
12
+
8
13
  READY = "\x01"
9
14
  REQUEST = "\x02"
10
15
  REPLY = "\x03"
@@ -15,6 +20,7 @@ module Majordomo
15
20
  HEARTBEAT_EXPIRY = HEARTBEAT_INTERVAL * HEARTBEAT_LIVENESS
16
21
  end
17
22
 
23
+ require 'majordomo/config'
18
24
  require 'majordomo/broker'
19
25
  require 'majordomo/worker'
20
- require 'majordomo/client'
26
+ require 'majordomo/async_client'
@@ -0,0 +1,55 @@
1
+ module Majordomo
2
+ class AsyncClient
3
+ attr_accessor :timeout, :client, :logger
4
+
5
+ # @param [Majordomo::Config] config
6
+ def initialize(config, context = ZMQ::Context.new)
7
+ @config = config
8
+ @context = context
9
+ @poller = ZMQ::Poller.new
10
+ @broker = config.broker_endpoint
11
+ @logger = ActiveSupport::Logger.new(STDOUT)
12
+
13
+ @timeout = 2500
14
+
15
+ connect_to_broker
16
+ end
17
+
18
+ def connect_to_broker
19
+ if @client
20
+ @poller.deregister(@client, ZMQ::POLLIN)
21
+ @client.close
22
+ end
23
+ @client = @context.socket(ZMQ::DEALER)
24
+ @client.connect(@broker)
25
+ @poller.register(@client, ZMQ::POLLIN)
26
+ end
27
+
28
+ def send_message(service, request)
29
+ request = [request] unless request.is_a?(Array)
30
+ request.unshift(service)
31
+ request.unshift(CLIENT)
32
+ request.unshift('')
33
+ @client.send_strings(request)
34
+ end
35
+
36
+ def receive_message(timeout = 60)
37
+ items = @poller.poll(timeout * 1000)
38
+ if items > 0
39
+ logger.debug "Broker has #{items} items"
40
+
41
+ @client.recv_strings(message = [])
42
+ message.shift
43
+ header = message.shift
44
+ raise unless header == CLIENT
45
+
46
+ message.shift #service
47
+
48
+ message
49
+ else
50
+ connect_to_broker
51
+ raise Timeout.new('Client timed out, reconnected to broker')
52
+ end
53
+ end
54
+ end
55
+ end
@@ -6,24 +6,33 @@ module Majordomo
6
6
 
7
7
  attr_accessor :workers, :waiting, :services, :socket
8
8
 
9
- def initialize(bind = 'tcp://*:5555', context = ZMQ::Context.new)
9
+ # @param [Majordomo::Config] config
10
+ def initialize(config, context = ZMQ::Context.new)
11
+ @config = config
10
12
  @context = context
11
13
  @socket = @context.socket(ZMQ::ROUTER)
12
14
  @poller = ZMQ::Poller.new
13
15
  @services = {}
14
16
  @workers = {}
15
17
  @waiting = []
16
- @heartbeat_at = Time.now + 0.001 * HEARTBEAT_INTERVAL
18
+ @heartbeat_at = Time.now + 0.001 * @config.heartbeat_interval
17
19
 
18
- @socket.bind(bind)
20
+ @socket.bind(config.broker_endpoint)
19
21
  @poller.register(@socket, ZMQ::POLLIN)
20
22
  trap(:INT) { exit }
21
23
  at_exit { destroy }
24
+
25
+ logger.debug "Broker is bound to: #{config.broker_endpoint}"
26
+ end
27
+
28
+ def logger
29
+ @config.logger
22
30
  end
23
31
 
24
32
  def mediate
33
+ logger.debug 'Broker is waiting for incoming messages'
25
34
  loop do
26
- items = @poller.poll(HEARTBEAT_INTERVAL)
35
+ items = @poller.poll(@config.heartbeat_interval)
27
36
 
28
37
  if items > 0
29
38
  @socket.recv_strings(message = [])
@@ -43,8 +52,7 @@ module Majordomo
43
52
  waiting.each do |worker|
44
53
  worker.send_message(HEARTBEAT)
45
54
  end
46
- @heartbeat_at = Time.now + 0.001 * HEARTBEAT_INTERVAL
47
- puts "Heartbeat #{waiting.count}"
55
+ @heartbeat_at = Time.now + 0.001 * @config.heartbeat_interval
48
56
  end
49
57
  end
50
58
  end
@@ -68,6 +76,7 @@ module Majordomo
68
76
  case command
69
77
  when READY
70
78
  if worker_ready
79
+ logger.debug "Worker was already marked as ready. Sending DISCONNECT to worker #{identity}"
71
80
  worker.delete(true)
72
81
  else
73
82
  service = message.shift
@@ -75,12 +84,14 @@ module Majordomo
75
84
  @waiting << worker
76
85
  worker.service.waiting << worker
77
86
  worker.service.workers += 1
78
- worker.expires_at = Time.now + 0.001 * HEARTBEAT_EXPIRY
87
+ worker.expires_at = Time.now + 0.001 * @config.heartbeat_expiry
88
+ logger.debug "Worker #{identity} for service #{worker.service.name} is ready"
79
89
  worker.service.dispatch
80
90
  end
81
91
  when REPLY
82
92
  if worker_ready
83
93
  client = message.shift
94
+ logger.debug "Worker #{identity} has a reply for #{client.unpack('H*').first}"
84
95
  message.shift
85
96
  message.unshift(worker.service.name)
86
97
  message.unshift(CLIENT)
@@ -96,8 +107,9 @@ module Majordomo
96
107
  @waiting.delete(worker)
97
108
  @waiting << worker
98
109
  end
99
- worker.expires_at = Time.now + 0.001 * HEARTBEAT_EXPIRY
110
+ worker.expires_at = Time.now + 0.001 * @config.heartbeat_expiry
100
111
  else
112
+ logger.debug "Worker #{identity} send HEARTBEAT before READY"
101
113
  worker.delete(true)
102
114
  end
103
115
  when DISCONNECT
@@ -107,18 +119,48 @@ module Majordomo
107
119
 
108
120
  def message_client(sender, message)
109
121
  service_name = message.shift
110
- service = Service.require(self, service_name)
122
+ logger.debug "Client #{sender.unpack('H*').first} send MESSAGE to service #{service_name}"
123
+
124
+ case service_name
125
+ when 'mmi.service'
126
+ message_service(sender, message)
127
+ else
128
+ service = Service.require(self, service_name)
111
129
 
112
- message.unshift nil
113
- message.unshift sender
130
+ message.unshift nil
131
+ message.unshift sender
114
132
 
115
- service.requests << message
116
- service.dispatch
133
+ service.requests << message
134
+ service.dispatch
135
+ logger.debug "Queued messages for service [#{service.name}]: #{service.requests.count}"
136
+ end
137
+ end
138
+
139
+ def message_service(sender, message)
140
+ command = message.shift
141
+
142
+ result = case command
143
+ when 'list-services'
144
+ services.values
145
+ else
146
+ { errors: 'unknown command' }
147
+ end
148
+
149
+ message.unshift(result.to_json)
150
+ message.unshift(nil)
151
+ message.unshift(CLIENT)
152
+ message.unshift(nil)
153
+ message.unshift(sender)
154
+
155
+ @socket.send_strings(message)
117
156
  end
118
157
 
119
158
  def purge
120
159
  waiting.each do |worker|
121
- worker.delete(false) if Time.now > worker.expires_at
160
+ if Time.now > worker.expires_at
161
+ logger.debug "Connection with worker #{worker.identity} lost"
162
+ worker.delete(false)
163
+ end
122
164
  end
123
165
  end
124
166
  end
@@ -6,12 +6,11 @@ module Majordomo
6
6
  attr_accessor :broker, :name, :requests, :waiting, :workers, :blacklist
7
7
 
8
8
  def initialize(broker, name)
9
- @broker = broker
10
- @name = name
11
- @requests = []
12
- @waiting = []
13
- @workers = 0
14
- @blacklist = ::Set.new
9
+ @broker = broker
10
+ @name = name
11
+ @requests = []
12
+ @waiting = []
13
+ @workers = 0
15
14
  end
16
15
 
17
16
  def self.require(broker, name)
@@ -24,6 +23,15 @@ module Majordomo
24
23
  service
25
24
  end
26
25
 
26
+ def as_json(options = {})
27
+ {
28
+ name: name,
29
+ workers: workers,
30
+ requests: requests.count,
31
+ workers_waiting: waiting.count
32
+ }
33
+ end
34
+
27
35
  def dispatch
28
36
  broker.purge
29
37
  return if waiting.empty?
@@ -35,18 +43,6 @@ module Majordomo
35
43
  waiting << worker
36
44
  end
37
45
  end
38
-
39
- def enable_command(command)
40
- @blacklist.delete(command)
41
- end
42
-
43
- def disable_command(command)
44
- @blacklist.add(command)
45
- end
46
-
47
- def command_enabled?(command)
48
- @blacklist.include?(command)
49
- end
50
46
  end
51
47
  end
52
48
  end
@@ -0,0 +1,34 @@
1
+ module Majordomo
2
+ class Config
3
+ attr_accessor :log_level, :heartbeat_interval, :heartbeat_liveness, :broker_endpoint, :logger
4
+
5
+ def initialize
6
+ defaults = {
7
+ log_level: Logger::DEBUG,
8
+ logger: ActiveSupport::Logger.new(STDOUT),
9
+ heartbeat_interval: HEARTBEAT_INTERVAL,
10
+ heartbeat_liveness: HEARTBEAT_LIVENESS,
11
+ broker_endpoint: 'tcp://127.0.0.1:5555'
12
+ }
13
+ configure(defaults)
14
+
15
+ logger.level = log_level
16
+ end
17
+
18
+ def configure(attributes = {}, &block)
19
+ if attributes.present?
20
+ attributes.each do |key, value|
21
+ public_send("#{key}=", value)
22
+ end
23
+ elsif block_given?
24
+ block.call(self)
25
+ else
26
+ raise ArgumentError.new('Configure requires a Hash or a Block')
27
+ end
28
+ end
29
+
30
+ def heartbeat_expiry
31
+ heartbeat_interval * heartbeat_liveness
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,3 @@
1
1
  module Majordomo
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -2,20 +2,25 @@ module Majordomo
2
2
  class Worker
3
3
  attr_accessor :broker, :service, :worker, :heartbeat_at, :heartbeat, :liveness, :reconnect
4
4
 
5
- def initialize(broker, service, context = ZMQ::Context.new)
5
+ # @param [Majordomo::Config] config
6
+ def initialize(config, service, context = ZMQ::Context.new)
7
+ @config = config
6
8
  @context = context
7
9
  @poller = ZMQ::Poller.new
8
- @broker = broker
9
10
  @service = service
10
11
 
11
- @heartbeat = HEARTBEAT_INTERVAL
12
- @reconnect = HEARTBEAT_INTERVAL
12
+ @heartbeat = @config.heartbeat_interval
13
+ @reconnect = @config.heartbeat_liveness
13
14
  connect_to_broker
14
15
 
15
16
  trap(:INT) { exit }
16
17
  at_exit { destroy }
17
18
  end
18
19
 
20
+ def logger
21
+ @config.logger
22
+ end
23
+
19
24
  def destroy
20
25
  @worker.close
21
26
  @context.terminate
@@ -23,18 +28,19 @@ module Majordomo
23
28
 
24
29
  def connect_to_broker
25
30
  if @worker
26
- puts 'Closing connection to broker'
31
+ logger.debug 'Closing connection to broker'
27
32
  @poller.deregister(@worker, ZMQ::POLLIN)
28
33
  @worker.close
29
34
  end
30
35
  @worker = @context.socket(ZMQ::DEALER)
31
- @worker.connect(@broker)
36
+ @worker.connect(@config.broker_endpoint)
32
37
  @worker.setsockopt(ZMQ::LINGER, 0)
33
38
  @poller.register(@worker, ZMQ::POLLIN)
39
+ @liveness = @config.heartbeat_liveness
40
+ @heartbeat_at = Time.now + 0.001 * @heartbeat
34
41
 
42
+ logger.debug 'Sending READY to broker'
35
43
  send_to_broker(READY, [@service])
36
- @liveness = HEARTBEAT_LIVENESS
37
- @heartbeat_at = Time.now + 0.001 * @heartbeat
38
44
  end
39
45
 
40
46
  def send_to_broker(command, message = [])
@@ -51,7 +57,7 @@ module Majordomo
51
57
  if items > 0
52
58
  @worker.recv_strings(message = [])
53
59
 
54
- @liveness = HEARTBEAT_LIVENESS
60
+ @liveness = @config.heartbeat_liveness
55
61
  message.shift
56
62
  header = message.shift
57
63
  raise unless header == WORKER
@@ -59,12 +65,14 @@ module Majordomo
59
65
  command = message.shift
60
66
  case command
61
67
  when REQUEST
68
+ logger.debug 'REQUEST from broker'
62
69
  reply_to << message.shift
63
70
  message.shift
64
71
  return message
65
72
  when HEARTBEAT
66
- # Do nothing
73
+ #
67
74
  when DISCONNECT
75
+ logger.debug 'DISCONNECT from broker'
68
76
  connect_to_broker
69
77
  else
70
78
  raise
@@ -81,6 +89,7 @@ module Majordomo
81
89
  end
82
90
 
83
91
  def send_message(report, reply_to)
92
+ logger.debug 'Sending REPLY to broker'
84
93
  report.unshift('')
85
94
  report.unshift(reply_to)
86
95
  send_to_broker(REPLY, report)
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
 
21
21
  spec.add_development_dependency 'bundler', '~> 1.3'
22
+ spec.add_development_dependency 'activesupport', '~> 4.1'
22
23
  spec.add_development_dependency 'rake'
23
24
  spec.add_dependency 'ffi-rzmq'
24
25
  end
@@ -3,7 +3,7 @@ require 'test_helper'
3
3
  class TestClient < MiniTest::Unit::TestCase
4
4
 
5
5
  def setup
6
- @client = Majordomo::Client.new('tcp://0.0.0.0:5555')
6
+ @client = Majordomo::AsyncClient.new(Majordomo::Config.new)
7
7
  end
8
8
 
9
9
  def test_connect_to_broker
@@ -8,13 +8,13 @@ class TestIntegration < MiniTest::Unit::TestCase
8
8
 
9
9
  def start_broker
10
10
  @threads << Thread.new do
11
- Majordomo::Broker.new.mediate
11
+ Majordomo::Broker.new(Majordomo::Config.new).mediate
12
12
  end
13
13
  end
14
14
 
15
15
  def start_worker
16
16
  @threads << Thread.new do
17
- worker = Majordomo::Worker.new('tcp://0.0.0.0:5555', 'echo')
17
+ worker = Majordomo::Worker.new(Majordomo::Config.new, 'echo')
18
18
 
19
19
  request = worker.receive_message(reply_to = '')
20
20
  worker.send_message(request, reply_to)
@@ -31,7 +31,7 @@ class TestIntegration < MiniTest::Unit::TestCase
31
31
  start_broker
32
32
  start_worker
33
33
 
34
- client = Majordomo::Client.new('tcp://0.0.0.0:5555')
34
+ client = Majordomo::AsyncClient.new(Majordomo::Config.new)
35
35
  client.send_message('echo', 'a')
36
36
 
37
37
  assert_equal %w(a), client.receive_message
@@ -0,0 +1,13 @@
1
+ require 'librmdp'
2
+
3
+ worker = Majordomo::Worker.new(Majordomo::Config.new, 'blaat')
4
+ @running = true
5
+
6
+ while @running do
7
+ request = worker.receive_message(reply_to = '')
8
+ # do something with a request
9
+
10
+ # sleep rand(5)
11
+
12
+ worker.send_message(request, reply_to)
13
+ end
metadata CHANGED
@@ -1,55 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: librmdp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benoist
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-20 00:00:00.000000000 Z
11
+ date: 2014-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.1'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ! '>='
45
+ - - ">="
32
46
  - !ruby/object:Gem::Version
33
47
  version: '0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ! '>='
52
+ - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: ffi-rzmq
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ! '>='
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
61
  version: '0'
48
62
  type: :runtime
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - ! '>='
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  description: A ruby implementation of the ZeroMQ majordomo pattern v0.1
@@ -59,22 +73,26 @@ executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
62
- - .gitignore
76
+ - ".gitignore"
63
77
  - Gemfile
64
78
  - LICENSE.txt
65
79
  - README.md
66
80
  - Rakefile
81
+ - broker.rb
82
+ - client.rb
67
83
  - lib/librmdp.rb
84
+ - lib/majordomo/async_client.rb
68
85
  - lib/majordomo/broker.rb
69
86
  - lib/majordomo/broker/service.rb
70
87
  - lib/majordomo/broker/worker.rb
71
- - lib/majordomo/client.rb
88
+ - lib/majordomo/config.rb
72
89
  - lib/majordomo/version.rb
73
90
  - lib/majordomo/worker.rb
74
91
  - librmdp.gemspec
75
- - test/client_test.rb
92
+ - test/async_client_test.rb
76
93
  - test/integration_test.rb
77
94
  - test/test_helper.rb
95
+ - worker.rb
78
96
  homepage: https://github.com/benoist/librmdp
79
97
  licenses:
80
98
  - MIT
@@ -85,21 +103,21 @@ require_paths:
85
103
  - lib
86
104
  required_ruby_version: !ruby/object:Gem::Requirement
87
105
  requirements:
88
- - - ! '>='
106
+ - - ">="
89
107
  - !ruby/object:Gem::Version
90
108
  version: '0'
91
109
  required_rubygems_version: !ruby/object:Gem::Requirement
92
110
  requirements:
93
- - - ! '>='
111
+ - - ">="
94
112
  - !ruby/object:Gem::Version
95
113
  version: '0'
96
114
  requirements: []
97
115
  rubyforge_project:
98
- rubygems_version: 2.0.7
116
+ rubygems_version: 2.2.2
99
117
  signing_key:
100
118
  specification_version: 4
101
119
  summary: A ruby implementation of the ZeroMQ majordomo pattern v0.1
102
120
  test_files:
103
- - test/client_test.rb
121
+ - test/async_client_test.rb
104
122
  - test/integration_test.rb
105
123
  - test/test_helper.rb
@@ -1,44 +0,0 @@
1
- module Majordomo
2
- class Client
3
- attr_accessor :timeout, :client
4
-
5
- def initialize(broker, context = ZMQ::Context.new)
6
- @context = context
7
- @poller = ZMQ::Poller.new
8
- @broker = broker
9
-
10
- @timeout = 2500
11
-
12
- connect_to_broker
13
- end
14
-
15
- def connect_to_broker
16
- if @client
17
- @poller.deregister(@client, ZMQ::POLLIN)
18
- @client.close
19
- end
20
- @client = @context.socket(ZMQ::DEALER)
21
- @client.connect(@broker)
22
- @poller.register(@client, ZMQ::POLLIN)
23
- end
24
-
25
- def send_message(service, request)
26
- request = [request] unless request.is_a?(Array)
27
- request.unshift(service)
28
- request.unshift(CLIENT)
29
- request.unshift('')
30
- @client.send_strings(request)
31
- end
32
-
33
- def receive_message
34
- @client.recv_strings(message = [])
35
- message.shift
36
- header = message.shift
37
- raise unless header == CLIENT
38
-
39
- message.shift #service
40
-
41
- message
42
- end
43
- end
44
- end