zmqmachine 0.6.0 → 0.7.1
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.
- data/.gitignore +15 -0
- data/AUTHORS.txt +3 -0
- data/History.txt +19 -0
- data/examples/fake_ftp.rb +9 -1
- data/examples/one_handed_ping_pong.rb +2 -1
- data/examples/ping_pong.rb +2 -2
- data/examples/pub_sub.rb +10 -4
- data/examples/pubsub_forwarder.rb +8 -3
- data/examples/throttled_ping_pong.rb +2 -2
- data/lib/zm/configuration.rb +129 -0
- data/lib/zm/device.rb +4 -0
- data/lib/zm/device/configuration.rb +24 -0
- data/lib/zm/{devices → device}/forwarder.rb +48 -46
- data/lib/zm/{devices → device}/queue.rb +63 -44
- data/lib/zm/log_client.rb +2 -2
- data/lib/zm/log_server.rb +68 -0
- data/lib/zm/reactor.rb +42 -29
- data/lib/zm/server.rb +4 -0
- data/lib/zm/server/base.rb +139 -0
- data/lib/zm/server/configuration.rb +53 -0
- data/lib/zm/server/pair.rb +23 -0
- data/lib/zm/server/pub.rb +23 -0
- data/lib/zm/server/pull.rb +24 -0
- data/lib/zm/server/push.rb +23 -0
- data/lib/zm/server/rep.rb +42 -0
- data/lib/zm/server/req.rb +41 -0
- data/lib/zm/server/routing_envelope.rb +26 -0
- data/lib/zm/server/sub.rb +40 -0
- data/lib/zm/sockets.rb +1 -1
- data/lib/zm/sockets/base.rb +3 -12
- data/lib/zm/sockets/envelope_help.rb +49 -0
- data/lib/zm/sockets/pair.rb +0 -1
- data/lib/zm/sockets/pub.rb +0 -1
- data/lib/zm/sockets/rep.rb +45 -0
- data/lib/zm/sockets/req.rb +46 -1
- data/lib/zm/sockets/sub.rb +0 -1
- data/lib/zm/timers.rb +26 -13
- data/lib/zmqmachine.rb +1 -1
- data/version.txt +1 -1
- data/zmqmachine.gemspec +6 -6
- metadata +90 -91
- data/lib/zm/devices.rb +0 -4
- data/lib/zm/sockets/xrep.rb +0 -86
- data/lib/zm/sockets/xreq.rb +0 -86
data/lib/zm/sockets/req.rb
CHANGED
@@ -42,7 +42,7 @@ module ZMQMachine
|
|
42
42
|
include ZMQMachine::Socket::Base
|
43
43
|
|
44
44
|
def initialize context, handler
|
45
|
-
@poll_options =
|
45
|
+
@poll_options = ZMQ::POLLIN
|
46
46
|
@kind = :request
|
47
47
|
|
48
48
|
super
|
@@ -74,6 +74,51 @@ module ZMQMachine
|
|
74
74
|
end
|
75
75
|
end # class Req
|
76
76
|
|
77
|
+
class XReq
|
78
|
+
include ZMQMachine::Socket::Base
|
79
|
+
include ZMQMachine::Socket::EnvelopeHelp
|
80
|
+
|
81
|
+
def initialize context, handler
|
82
|
+
@poll_options = ZMQ::POLLIN
|
83
|
+
@kind = :xrequest
|
84
|
+
|
85
|
+
super
|
86
|
+
end
|
87
|
+
|
88
|
+
# Attach a handler to the XREQ socket.
|
89
|
+
#
|
90
|
+
# A XREQ socket has no restrictions on the number of sends and
|
91
|
+
# recieves. Each send will silently prepend a message part to
|
92
|
+
# your outgoing data which the REP/XREP socket on the other end
|
93
|
+
# will use for matching up the transaction.
|
94
|
+
#
|
95
|
+
# This socket expects its +handler+ to
|
96
|
+
# implement at least the #on_readable method. This method
|
97
|
+
# will be called whenever a reply arrives. The #on_writable method
|
98
|
+
# will be called continually until the socket HWM is breached.
|
99
|
+
#
|
100
|
+
# For error handling purposes, the handler must also
|
101
|
+
# implement #on_readable_error.
|
102
|
+
#
|
103
|
+
def on_attach handler
|
104
|
+
raise ArgumentError, "Handler must implement an #on_readable method" unless handler.respond_to? :on_readable
|
105
|
+
raise ArgumentError, "Handler must implement an #on_readable_error method" unless handler.respond_to? :on_readable_error
|
106
|
+
raise ArgumentError, "Handler must implement an #on_writable method" unless handler.respond_to? :on_writable
|
107
|
+
raise ArgumentError, "Handler must implement an #on_writable_error method" unless handler.respond_to? :on_writable_error
|
108
|
+
super
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def allocate_socket context
|
115
|
+
sock = ZMQ::Socket.new context.pointer, ZMQ::XREQ
|
116
|
+
sock
|
117
|
+
end
|
118
|
+
end # class XReq
|
119
|
+
|
120
|
+
Dealer = XReq
|
121
|
+
|
77
122
|
end # module Socket
|
78
123
|
|
79
124
|
end # module ZMQMachine
|
data/lib/zm/sockets/sub.rb
CHANGED
data/lib/zm/timers.rb
CHANGED
@@ -47,7 +47,8 @@ module ZMQMachine
|
|
47
47
|
# new timers are installed in the correct #Reactor.
|
48
48
|
#
|
49
49
|
class Timers
|
50
|
-
def initialize
|
50
|
+
def initialize(exception_handler)
|
51
|
+
@exception_handler = exception_handler
|
51
52
|
@timers = []
|
52
53
|
end
|
53
54
|
|
@@ -70,14 +71,14 @@ module ZMQMachine
|
|
70
71
|
add timer
|
71
72
|
timer
|
72
73
|
end
|
73
|
-
|
74
|
+
|
74
75
|
# Adds a non-periodical, one-shot timer to be fired at
|
75
76
|
# the specified time.
|
76
77
|
#
|
77
78
|
def add_oneshot_at exact_time, timer_proc = nil, &blk
|
78
79
|
blk ||= timer_proc
|
79
80
|
return nil unless blk
|
80
|
-
|
81
|
+
|
81
82
|
timer = Timer.new :timers => self, :exact_time => exact_time, :periodical => false, :timer_proc => blk
|
82
83
|
add timer
|
83
84
|
timer
|
@@ -113,7 +114,7 @@ module ZMQMachine
|
|
113
114
|
if i < @timers.size && timer == @timers.at(i)
|
114
115
|
@timers.delete_at(i) ? true : false
|
115
116
|
else
|
116
|
-
# slow branch; necessary since the #index operation works
|
117
|
+
# slow branch; necessary since the #index operation works
|
117
118
|
# solely from the timer.fire_time attribute. There
|
118
119
|
# could be multiple timers scheduled to fire at the
|
119
120
|
# same time so the equivalence test above could fail
|
@@ -121,7 +122,7 @@ module ZMQMachine
|
|
121
122
|
# slower method
|
122
123
|
size = @timers.size
|
123
124
|
@timers.delete_if { |t| t == timer }
|
124
|
-
|
125
|
+
|
125
126
|
# true when the array has shrunk, false otherwise
|
126
127
|
@timers.size != size
|
127
128
|
end
|
@@ -163,7 +164,20 @@ module ZMQMachine
|
|
163
164
|
end
|
164
165
|
|
165
166
|
remove expired_count
|
166
|
-
|
167
|
+
|
168
|
+
while timer = runnables.shift
|
169
|
+
begin
|
170
|
+
timer.fire
|
171
|
+
rescue => e
|
172
|
+
if @exception_handler
|
173
|
+
@exception_handler.call(e)
|
174
|
+
else
|
175
|
+
renew(periodicals)
|
176
|
+
raise
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
167
181
|
renew periodicals
|
168
182
|
end
|
169
183
|
|
@@ -202,7 +216,7 @@ module ZMQMachine
|
|
202
216
|
|
203
217
|
private
|
204
218
|
|
205
|
-
# inserts in order using a binary search (O(nlog n)) to find the
|
219
|
+
# inserts in order using a binary search (O(nlog n)) to find the
|
206
220
|
# index to insert; this scales nicely for situations where there
|
207
221
|
# are many thousands thousands of timers
|
208
222
|
def add timer
|
@@ -277,9 +291,8 @@ module ZMQMachine
|
|
277
291
|
# itself.
|
278
292
|
#
|
279
293
|
def fire
|
280
|
-
@timer_proc.call
|
281
|
-
|
282
294
|
schedule_firing_time if @periodical
|
295
|
+
@timer_proc.call
|
283
296
|
end
|
284
297
|
|
285
298
|
# Cancels this timer from firing.
|
@@ -291,7 +304,7 @@ module ZMQMachine
|
|
291
304
|
def <=>(other)
|
292
305
|
@fire_time <=> other.fire_time
|
293
306
|
end
|
294
|
-
|
307
|
+
|
295
308
|
def ==(other)
|
296
309
|
# need a more specific equivalence test since multiple timers could be
|
297
310
|
# scheduled to go off at exactly the same time
|
@@ -316,15 +329,15 @@ module ZMQMachine
|
|
316
329
|
def reschedule
|
317
330
|
schedule_firing_time
|
318
331
|
end
|
319
|
-
|
332
|
+
|
320
333
|
def to_s
|
321
334
|
ftime = Time.at(@fire_time / 1000)
|
322
335
|
fdelay = @fire_time - Timers.now
|
323
336
|
name = @timer_proc.respond_to?(:name) ? @timer_proc.name : @timer_proc.to_s
|
324
|
-
|
337
|
+
|
325
338
|
"[delay [#{@delay}], periodical? [#{@periodical}], fire_time [#{ftime}] fire_delay_ms [#{fdelay}]] proc [#{name}]"
|
326
339
|
end
|
327
|
-
|
340
|
+
|
328
341
|
def inspect; to_s; end
|
329
342
|
|
330
343
|
|
data/lib/zmqmachine.rb
CHANGED
@@ -65,7 +65,7 @@ require 'singleton'
|
|
65
65
|
require 'ffi-rzmq'
|
66
66
|
|
67
67
|
# the order of files is important
|
68
|
-
%w(address exceptions timers deferrable log_client reactor message sockets
|
68
|
+
%w(address exceptions timers deferrable configuration server log_client log_server reactor message sockets device).each do |file|
|
69
69
|
require ZMQMachine.libpath(['zm', file])
|
70
70
|
end
|
71
71
|
|
data/version.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.7.1
|
data/zmqmachine.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{zmqmachine}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.7.1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Chuck Remes"]
|
9
|
-
s.date = %q{2011-
|
9
|
+
s.date = %q{2011-11-30}
|
10
10
|
s.description = %q{ZMQMachine is another Ruby implementation of the reactor pattern but this
|
11
11
|
time using 0mq sockets rather than POSIX sockets.
|
12
12
|
|
@@ -22,7 +22,7 @@ It is possible to extend the 0mq library to "poll" normal file
|
|
22
22
|
descriptors. This isn't on my roadmap but patches are accepted.}
|
23
23
|
s.email = %q{cremes@mac.com}
|
24
24
|
s.extra_rdoc_files = ["History.txt", "README.rdoc", "version.txt"]
|
25
|
-
s.files =
|
25
|
+
s.files = `git ls-files`.split("\n")
|
26
26
|
s.homepage = %q{http://github.com/chuckremes/zmqmachine}
|
27
27
|
s.rdoc_options = ["--main", "README.rdoc"]
|
28
28
|
s.require_paths = ["lib"]
|
@@ -35,14 +35,14 @@ descriptors. This isn't on my roadmap but patches are accepted.}
|
|
35
35
|
s.specification_version = 3
|
36
36
|
|
37
37
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
38
|
-
s.add_runtime_dependency(%q<ffi-rzmq>, [">= 0.
|
38
|
+
s.add_runtime_dependency(%q<ffi-rzmq>, [">= 0.9.2"])
|
39
39
|
s.add_development_dependency(%q<bones>, [">= 3.5.4"])
|
40
40
|
else
|
41
|
-
s.add_dependency(%q<ffi-rzmq>, [">= 0.
|
41
|
+
s.add_dependency(%q<ffi-rzmq>, [">= 0.9.0"])
|
42
42
|
s.add_dependency(%q<bones>, [">= 3.5.4"])
|
43
43
|
end
|
44
44
|
else
|
45
|
-
s.add_dependency(%q<ffi-rzmq>, [">= 0.
|
45
|
+
s.add_dependency(%q<ffi-rzmq>, [">= 0.9.0"])
|
46
46
|
s.add_dependency(%q<bones>, [">= 3.5.4"])
|
47
47
|
end
|
48
48
|
end
|
metadata
CHANGED
@@ -1,52 +1,40 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zmqmachine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 6
|
8
|
-
- 0
|
9
|
-
version: 0.6.0
|
4
|
+
prerelease:
|
5
|
+
version: 0.7.1
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
|
-
- Chuck Remes
|
8
|
+
- Chuck Remes
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date: 2011-
|
13
|
+
date: 2011-11-30 00:00:00 -06:00
|
18
14
|
default_executable:
|
19
15
|
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
segments:
|
44
|
-
- 3
|
45
|
-
- 5
|
46
|
-
- 4
|
47
|
-
version: 3.5.4
|
48
|
-
type: :development
|
49
|
-
version_requirements: *id002
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: ffi-rzmq
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 0.9.2
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bones
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 3.5.4
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id002
|
50
38
|
description: |-
|
51
39
|
ZMQMachine is another Ruby implementation of the reactor pattern but this
|
52
40
|
time using 0mq sockets rather than POSIX sockets.
|
@@ -67,76 +55,87 @@ executables: []
|
|
67
55
|
extensions: []
|
68
56
|
|
69
57
|
extra_rdoc_files:
|
70
|
-
- History.txt
|
71
|
-
- README.rdoc
|
72
|
-
- version.txt
|
58
|
+
- History.txt
|
59
|
+
- README.rdoc
|
60
|
+
- version.txt
|
73
61
|
files:
|
74
|
-
- .bnsignore
|
75
|
-
-
|
76
|
-
-
|
77
|
-
-
|
78
|
-
-
|
79
|
-
-
|
80
|
-
- examples/
|
81
|
-
- examples/
|
82
|
-
- examples/
|
83
|
-
- examples/
|
84
|
-
-
|
85
|
-
-
|
86
|
-
- lib/zm/
|
87
|
-
- lib/zm/
|
88
|
-
- lib/zm/
|
89
|
-
- lib/zm/
|
90
|
-
- lib/zm/
|
91
|
-
- lib/zm/
|
92
|
-
- lib/zm/
|
93
|
-
- lib/zm/
|
94
|
-
- lib/zm/
|
95
|
-
- lib/zm/
|
96
|
-
- lib/zm/
|
97
|
-
- lib/zm/
|
98
|
-
- lib/zm/
|
99
|
-
- lib/zm/
|
100
|
-
- lib/zm/
|
101
|
-
- lib/zm/
|
102
|
-
- lib/zm/
|
103
|
-
- lib/zm/
|
104
|
-
- lib/zm/
|
105
|
-
- lib/
|
106
|
-
-
|
107
|
-
-
|
108
|
-
-
|
109
|
-
-
|
62
|
+
- .bnsignore
|
63
|
+
- .gitignore
|
64
|
+
- AUTHORS.txt
|
65
|
+
- History.txt
|
66
|
+
- README.rdoc
|
67
|
+
- Rakefile
|
68
|
+
- examples/fake_ftp.rb
|
69
|
+
- examples/one_handed_ping_pong.rb
|
70
|
+
- examples/ping_pong.rb
|
71
|
+
- examples/pub_sub.rb
|
72
|
+
- examples/pubsub_forwarder.rb
|
73
|
+
- examples/throttled_ping_pong.rb
|
74
|
+
- lib/zm/address.rb
|
75
|
+
- lib/zm/configuration.rb
|
76
|
+
- lib/zm/deferrable.rb
|
77
|
+
- lib/zm/device.rb
|
78
|
+
- lib/zm/device/configuration.rb
|
79
|
+
- lib/zm/device/forwarder.rb
|
80
|
+
- lib/zm/device/queue.rb
|
81
|
+
- lib/zm/exceptions.rb
|
82
|
+
- lib/zm/log_client.rb
|
83
|
+
- lib/zm/log_server.rb
|
84
|
+
- lib/zm/message.rb
|
85
|
+
- lib/zm/reactor.rb
|
86
|
+
- lib/zm/server.rb
|
87
|
+
- lib/zm/server/base.rb
|
88
|
+
- lib/zm/server/configuration.rb
|
89
|
+
- lib/zm/server/pair.rb
|
90
|
+
- lib/zm/server/pub.rb
|
91
|
+
- lib/zm/server/pull.rb
|
92
|
+
- lib/zm/server/push.rb
|
93
|
+
- lib/zm/server/rep.rb
|
94
|
+
- lib/zm/server/req.rb
|
95
|
+
- lib/zm/server/routing_envelope.rb
|
96
|
+
- lib/zm/server/sub.rb
|
97
|
+
- lib/zm/sockets.rb
|
98
|
+
- lib/zm/sockets/base.rb
|
99
|
+
- lib/zm/sockets/envelope_help.rb
|
100
|
+
- lib/zm/sockets/pair.rb
|
101
|
+
- lib/zm/sockets/pub.rb
|
102
|
+
- lib/zm/sockets/pull.rb
|
103
|
+
- lib/zm/sockets/push.rb
|
104
|
+
- lib/zm/sockets/rep.rb
|
105
|
+
- lib/zm/sockets/req.rb
|
106
|
+
- lib/zm/sockets/sub.rb
|
107
|
+
- lib/zm/timers.rb
|
108
|
+
- lib/zmqmachine.rb
|
109
|
+
- spec/reactor_spec.rb
|
110
|
+
- spec/spec_helper.rb
|
111
|
+
- version.txt
|
112
|
+
- zmqmachine.gemspec
|
110
113
|
has_rdoc: true
|
111
114
|
homepage: http://github.com/chuckremes/zmqmachine
|
112
115
|
licenses: []
|
113
116
|
|
114
117
|
post_install_message:
|
115
118
|
rdoc_options:
|
116
|
-
- --main
|
117
|
-
- README.rdoc
|
119
|
+
- --main
|
120
|
+
- README.rdoc
|
118
121
|
require_paths:
|
119
|
-
- lib
|
122
|
+
- lib
|
120
123
|
required_ruby_version: !ruby/object:Gem::Requirement
|
121
124
|
none: false
|
122
125
|
requirements:
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
- 0
|
127
|
-
version: "0"
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: "0"
|
128
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
130
|
none: false
|
130
131
|
requirements:
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
- 0
|
135
|
-
version: "0"
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: "0"
|
136
135
|
requirements: []
|
137
136
|
|
138
137
|
rubyforge_project: zmqmachine
|
139
|
-
rubygems_version: 1.
|
138
|
+
rubygems_version: 1.5.1
|
140
139
|
signing_key:
|
141
140
|
specification_version: 3
|
142
141
|
summary: ZMQMachine is another Ruby implementation of the reactor pattern but this time using 0mq sockets rather than POSIX sockets.
|