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 +6 -14
- data/.gitignore +1 -0
- data/Gemfile +1 -0
- data/README.md +2 -2
- data/broker.rb +4 -0
- data/client.rb +27 -0
- data/lib/librmdp.rb +7 -1
- data/lib/majordomo/async_client.rb +55 -0
- data/lib/majordomo/broker.rb +56 -14
- data/lib/majordomo/broker/service.rb +14 -18
- data/lib/majordomo/config.rb +34 -0
- data/lib/majordomo/version.rb +1 -1
- data/lib/majordomo/worker.rb +19 -10
- data/librmdp.gemspec +1 -0
- data/test/{client_test.rb → async_client_test.rb} +1 -1
- data/test/integration_test.rb +3 -3
- data/worker.rb +13 -0
- metadata +33 -15
- data/lib/majordomo/client.rb +0 -44
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
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
data/Gemfile
CHANGED
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(
|
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::
|
43
|
+
client = Majordomo::AsyncClient.new(Majordomo::Config.new)
|
44
44
|
client.send_message('echo', 'a')
|
45
45
|
|
46
46
|
response = client.receive_message
|
data/broker.rb
ADDED
data/client.rb
ADDED
@@ -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)
|
data/lib/librmdp.rb
CHANGED
@@ -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/
|
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
|
data/lib/majordomo/broker.rb
CHANGED
@@ -6,24 +6,33 @@ module Majordomo
|
|
6
6
|
|
7
7
|
attr_accessor :workers, :waiting, :services, :socket
|
8
8
|
|
9
|
-
|
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 *
|
18
|
+
@heartbeat_at = Time.now + 0.001 * @config.heartbeat_interval
|
17
19
|
|
18
|
-
@socket.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(
|
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 *
|
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 *
|
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 *
|
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
|
-
|
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
|
-
|
113
|
-
|
130
|
+
message.unshift nil
|
131
|
+
message.unshift sender
|
114
132
|
|
115
|
-
|
116
|
-
|
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
|
-
|
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
|
10
|
-
@name
|
11
|
-
@requests
|
12
|
-
@waiting
|
13
|
-
@workers
|
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
|
data/lib/majordomo/version.rb
CHANGED
data/lib/majordomo/worker.rb
CHANGED
@@ -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
|
-
|
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 =
|
12
|
-
@reconnect =
|
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
|
-
|
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(@
|
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 =
|
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
|
-
|
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)
|
data/librmdp.gemspec
CHANGED
@@ -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
|
data/test/integration_test.rb
CHANGED
@@ -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(
|
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::
|
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
|
data/worker.rb
ADDED
@@ -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
|
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:
|
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/
|
88
|
+
- lib/majordomo/config.rb
|
72
89
|
- lib/majordomo/version.rb
|
73
90
|
- lib/majordomo/worker.rb
|
74
91
|
- librmdp.gemspec
|
75
|
-
- test/
|
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.
|
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/
|
121
|
+
- test/async_client_test.rb
|
104
122
|
- test/integration_test.rb
|
105
123
|
- test/test_helper.rb
|
data/lib/majordomo/client.rb
DELETED
@@ -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
|