em-zeromq 0.4.0 → 0.4.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/README.md +2 -0
- data/Rakefile +1 -0
- data/em-zeromq.gemspec +1 -1
- data/example/multi-part.rb +3 -0
- data/example/simple.rb +1 -0
- data/example/simpler.rb +1 -0
- data/lib/em-zeromq.rb +7 -0
- data/lib/em-zeromq/socket.rb +38 -28
- data/lib/em-zeromq/version.rb +1 -1
- data/spec/context_spec.rb +1 -10
- data/spec/pub_sub_spec.rb +4 -4
- data/spec/socket_spec.rb +29 -0
- data/spec/spec_helper.rb +3 -7
- metadata +8 -6
data/README.md
CHANGED
@@ -66,6 +66,7 @@ EM.run {
|
|
66
66
|
|
67
67
|
pull.on(:message) { |part|
|
68
68
|
puts part.copy_out_string
|
69
|
+
part.close
|
69
70
|
}
|
70
71
|
|
71
72
|
EM.add_periodic_timer(1) {
|
@@ -73,6 +74,7 @@ EM.run {
|
|
73
74
|
}
|
74
75
|
}
|
75
76
|
```
|
77
|
+
Note that it's important to close message parts to avoid memory leaks.
|
76
78
|
|
77
79
|
## License: ##
|
78
80
|
|
data/Rakefile
CHANGED
data/em-zeromq.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
|
18
18
|
s.add_dependency 'eventmachine', '>= 1.0.0'
|
19
19
|
s.add_dependency 'ffi', '>= 1.0.0'
|
20
|
-
s.add_dependency 'ffi-rzmq', '0.9.
|
20
|
+
s.add_dependency 'ffi-rzmq', '= 0.9.7'
|
21
21
|
|
22
22
|
s.add_development_dependency 'rspec', '>= 2.5.0'
|
23
23
|
s.add_development_dependency 'simplecov'
|
data/example/multi-part.rb
CHANGED
@@ -13,10 +13,13 @@ EM.run {
|
|
13
13
|
|
14
14
|
pull.on(:message) { |part1, part2|
|
15
15
|
p [:part1, part1.copy_out_string, :part2, part2.copy_out_string]
|
16
|
+
part1.close
|
17
|
+
part2.close
|
16
18
|
}
|
17
19
|
|
18
20
|
pull.on(:message) { |*parts|
|
19
21
|
p [:parts, parts.map(&:copy_out_string)]
|
22
|
+
parts.each(&:close)
|
20
23
|
}
|
21
24
|
|
22
25
|
push = zmq.socket(ZMQ::PUSH)
|
data/example/simple.rb
CHANGED
data/example/simpler.rb
CHANGED
data/lib/em-zeromq.rb
CHANGED
data/lib/em-zeromq/socket.rb
CHANGED
@@ -6,7 +6,7 @@ module EventMachine
|
|
6
6
|
|
7
7
|
include EventEmitter
|
8
8
|
|
9
|
-
attr_reader :socket, :socket_type
|
9
|
+
attr_reader :socket, :socket_type
|
10
10
|
|
11
11
|
def initialize(socket, socket_type)
|
12
12
|
@socket = socket
|
@@ -15,43 +15,53 @@ module EventMachine
|
|
15
15
|
self.notify_readable = true if READABLES.include?(socket_type)
|
16
16
|
self.notify_writable = true if WRITABLES.include?(socket_type)
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def self.map_sockopt(opt, name)
|
20
20
|
define_method(name){ getsockopt(opt) }
|
21
|
-
define_method("#{name}="){|val|
|
21
|
+
define_method("#{name}="){|val| setsockopt(opt, val) }
|
22
|
+
end
|
23
|
+
|
24
|
+
if defined?(ZMQ::HWM)
|
25
|
+
map_sockopt(ZMQ::HWM, :hwm)
|
26
|
+
else
|
27
|
+
map_sockopt(ZMQ::SNDHWM, :sndhwm)
|
28
|
+
map_sockopt(ZMQ::RCVHWM, :rcvhwm)
|
29
|
+
def hwm=(val)
|
30
|
+
self.sndhwm = val
|
31
|
+
self.rcvhwm = val
|
32
|
+
end
|
22
33
|
end
|
23
|
-
|
24
|
-
map_sockopt(ZMQ::
|
25
|
-
map_sockopt(ZMQ::SWAP, :swap)
|
34
|
+
|
35
|
+
map_sockopt(ZMQ::SWAP, :swap) if defined?(ZMQ::SWAP)
|
26
36
|
map_sockopt(ZMQ::IDENTITY, :identity)
|
27
37
|
map_sockopt(ZMQ::AFFINITY, :affinity)
|
28
38
|
map_sockopt(ZMQ::SNDBUF, :sndbuf)
|
29
39
|
map_sockopt(ZMQ::RCVBUF, :rcvbuf)
|
30
|
-
|
40
|
+
|
31
41
|
# pgm
|
32
42
|
map_sockopt(ZMQ::RATE, :rate)
|
33
43
|
map_sockopt(ZMQ::RECOVERY_IVL, :recovery_ivl)
|
34
|
-
map_sockopt(ZMQ::MCAST_LOOP, :mcast_loop)
|
35
|
-
|
44
|
+
map_sockopt(ZMQ::MCAST_LOOP, :mcast_loop) if defined?(ZMQ::MCAST_LOOP)
|
45
|
+
|
36
46
|
# User method
|
37
47
|
def bind(address)
|
38
48
|
@socket.bind(address)
|
39
49
|
end
|
40
|
-
|
50
|
+
|
41
51
|
def connect(address)
|
42
52
|
@socket.connect(address)
|
43
53
|
end
|
44
|
-
|
54
|
+
|
45
55
|
def subscribe(what = '')
|
46
56
|
raise "only valid on sub socket type (was #{@socket.name})" unless @socket.name == 'SUB'
|
47
57
|
@socket.setsockopt(ZMQ::SUBSCRIBE, what)
|
48
58
|
end
|
49
|
-
|
59
|
+
|
50
60
|
def unsubscribe(what)
|
51
61
|
raise "only valid on sub socket type (was #{@socket.name})" unless @socket.name == 'SUB'
|
52
62
|
@socket.setsockopt(ZMQ::UNSUBSCRIBE, what)
|
53
63
|
end
|
54
|
-
|
64
|
+
|
55
65
|
# send a non blocking message
|
56
66
|
# parts: if only one argument is given a signle part message is sent
|
57
67
|
# if more than one arguments is given a multipart message is sent
|
@@ -61,34 +71,34 @@ module EventMachine
|
|
61
71
|
def send_msg(*parts)
|
62
72
|
parts = Array(parts[0]) if parts.size == 0
|
63
73
|
sent = true
|
64
|
-
|
74
|
+
|
65
75
|
# multipart
|
66
76
|
parts[0...-1].each do |msg|
|
67
|
-
|
68
|
-
if
|
77
|
+
ret = @socket.send_string(msg, ZMQ::NOBLOCK | ZMQ::SNDMORE)
|
78
|
+
if ret < 0
|
79
|
+
sent = false
|
69
80
|
break
|
70
81
|
end
|
71
82
|
end
|
72
|
-
|
83
|
+
|
73
84
|
if sent
|
74
85
|
# all the previous parts were queued, send
|
75
86
|
# the last one
|
76
87
|
ret = @socket.send_string(parts[-1], ZMQ::NOBLOCK)
|
77
88
|
if ret < 0
|
78
|
-
|
89
|
+
sent = false
|
79
90
|
end
|
80
91
|
else
|
81
92
|
# error while sending the previous parts
|
82
93
|
# register the socket for writability
|
83
94
|
self.notify_writable = true
|
84
|
-
sent = false
|
85
95
|
end
|
86
|
-
|
96
|
+
|
87
97
|
EM::next_tick{ notify_readable() }
|
88
|
-
|
98
|
+
|
89
99
|
sent
|
90
100
|
end
|
91
|
-
|
101
|
+
|
92
102
|
def getsockopt(opt)
|
93
103
|
ret = []
|
94
104
|
rc = @socket.getsockopt(opt, ret)
|
@@ -96,9 +106,9 @@ module EventMachine
|
|
96
106
|
raise ZMQOperationFailed, "getsockopt: #{ZMQ::Util.error_string}"
|
97
107
|
end
|
98
108
|
|
99
|
-
(ret.size == 1) ? ret[0] : ret
|
109
|
+
(ret.size == 1) ? ret[0] : ret
|
100
110
|
end
|
101
|
-
|
111
|
+
|
102
112
|
def setsockopt(opt, value)
|
103
113
|
@socket.setsockopt(opt, value)
|
104
114
|
end
|
@@ -119,15 +129,15 @@ module EventMachine
|
|
119
129
|
emit(:message, *message)
|
120
130
|
end
|
121
131
|
end
|
122
|
-
|
132
|
+
|
123
133
|
def notify_writable
|
124
134
|
return unless writable?
|
125
|
-
|
135
|
+
|
126
136
|
# one a writable event is successfully received the socket
|
127
137
|
# should be accepting messages again so stop triggering
|
128
138
|
# write events
|
129
139
|
self.notify_writable = false
|
130
|
-
|
140
|
+
|
131
141
|
emit(:writable)
|
132
142
|
end
|
133
143
|
def readable?
|
@@ -139,7 +149,7 @@ module EventMachine
|
|
139
149
|
# ZMQ::EVENTS has issues in ZMQ HEAD, we'll ignore this till they're fixed
|
140
150
|
# (getsockopt(ZMQ::EVENTS) & ZMQ::POLLOUT) == ZMQ::POLLOUT
|
141
151
|
end
|
142
|
-
|
152
|
+
|
143
153
|
private
|
144
154
|
|
145
155
|
def get_message
|
data/lib/em-zeromq/version.rb
CHANGED
data/spec/context_spec.rb
CHANGED
@@ -4,19 +4,10 @@ describe 'Context' do
|
|
4
4
|
before do
|
5
5
|
@ctx = EM::ZeroMQ::Context.new(1)
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
it 'can be created with a context' do
|
9
9
|
zmq_ctx = ZMQ::Context.new(1)
|
10
10
|
ctx = EM::ZeroMQ::Context.new( zmq_ctx )
|
11
11
|
ctx.instance_variable_get('@context').should == zmq_ctx
|
12
12
|
end
|
13
|
-
|
14
|
-
it 'can create socket' do
|
15
|
-
EM::run do
|
16
|
-
s = @ctx.socket(ZMQ::ROUTER)
|
17
|
-
s.instance_variable_get('@socket').name.should == 'ROUTER'
|
18
|
-
EM::stop_event_loop
|
19
|
-
end
|
20
|
-
end
|
21
13
|
end
|
22
|
-
|
data/spec/pub_sub_spec.rb
CHANGED
@@ -18,7 +18,7 @@ describe EventMachine::ZeroMQ do
|
|
18
18
|
@received = []
|
19
19
|
@test_message = test_message = "TMsg#{rand(999)}"
|
20
20
|
|
21
|
-
run_reactor do
|
21
|
+
run_reactor(0.2) do
|
22
22
|
address = rand_addr
|
23
23
|
|
24
24
|
sub_conn = SPEC_CTX.socket(ZMQ::SUB)
|
@@ -31,9 +31,9 @@ describe EventMachine::ZeroMQ do
|
|
31
31
|
pub_conn = SPEC_CTX.socket(ZMQ::PUB)
|
32
32
|
pub_conn.connect(address)
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
EM::Timer.new(0.1) do
|
35
|
+
pub_conn.socket.send_string test_message, ZMQ::NOBLOCK
|
36
|
+
end
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
data/spec/socket_spec.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[spec_helper])
|
2
|
+
|
3
|
+
describe 'Socket' do
|
4
|
+
before do
|
5
|
+
@ctx = EM::ZeroMQ::Context.new(1)
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'can create a socket' do
|
9
|
+
EM.run do
|
10
|
+
s = @ctx.socket(ZMQ::ROUTER)
|
11
|
+
s.instance_variable_get('@socket').name.should == 'ROUTER'
|
12
|
+
EM.stop
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'can set hwm' do
|
17
|
+
EM.run do
|
18
|
+
s = @ctx.socket(ZMQ::PUSH)
|
19
|
+
s.hwm = 100
|
20
|
+
if defined?(ZMQ::HWM)
|
21
|
+
s.hwm.should == 100
|
22
|
+
else
|
23
|
+
s.rcvhwm.should == 100
|
24
|
+
s.sndhwm.should == 100
|
25
|
+
end
|
26
|
+
EM.stop
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -11,14 +11,10 @@ require File.expand_path(
|
|
11
11
|
File.join(File.dirname(__FILE__), %w[.. lib em-zeromq]))
|
12
12
|
|
13
13
|
def run_reactor(time=0.1,&block)
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
14
|
+
EM.run do
|
15
|
+
yield
|
16
|
+
EM.add_timer(time){EM.stop}
|
18
17
|
end
|
19
|
-
sleep time
|
20
|
-
EM.stop rescue nil
|
21
|
-
sleep 0.1
|
22
18
|
end
|
23
19
|
|
24
20
|
USED_RAND_ADDRS = Set.new
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-zeromq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2013-01-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: eventmachine
|
@@ -51,7 +51,7 @@ dependencies:
|
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.9.
|
54
|
+
version: 0.9.7
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
57
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -59,7 +59,7 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - '='
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 0.9.
|
62
|
+
version: 0.9.7
|
63
63
|
- !ruby/object:Gem::Dependency
|
64
64
|
name: rspec
|
65
65
|
requirement: !ruby/object:Gem::Requirement
|
@@ -135,6 +135,7 @@ files:
|
|
135
135
|
- spec/pub_sub_spec.rb
|
136
136
|
- spec/push_pull_spec.rb
|
137
137
|
- spec/router_dealer_spec.rb
|
138
|
+
- spec/socket_spec.rb
|
138
139
|
- spec/spec_helper.rb
|
139
140
|
homepage: https://github.com/andrewvc/em-zeromq
|
140
141
|
licenses: []
|
@@ -152,7 +153,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
152
153
|
version: '0'
|
153
154
|
segments:
|
154
155
|
- 0
|
155
|
-
hash:
|
156
|
+
hash: -528291771408101050
|
156
157
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
158
|
none: false
|
158
159
|
requirements:
|
@@ -161,7 +162,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
162
|
version: '0'
|
162
163
|
segments:
|
163
164
|
- 0
|
164
|
-
hash:
|
165
|
+
hash: -528291771408101050
|
165
166
|
requirements: []
|
166
167
|
rubyforge_project: em-zeromq
|
167
168
|
rubygems_version: 1.8.24
|
@@ -173,4 +174,5 @@ test_files:
|
|
173
174
|
- spec/pub_sub_spec.rb
|
174
175
|
- spec/push_pull_spec.rb
|
175
176
|
- spec/router_dealer_spec.rb
|
177
|
+
- spec/socket_spec.rb
|
176
178
|
- spec/spec_helper.rb
|