librmdp 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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