stomper 0.3.1 → 0.3.2
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.rdoc +2 -2
- data/lib/stomper/client.rb +27 -20
- data/lib/stomper/connection.rb +13 -22
- data/spec/client_spec.rb +10 -0
- data/spec/connection_spec.rb +1 -1
- data/spec/shared_connection_examples.rb +7 -7
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -64,5 +64,5 @@ API compatibility with the original gem, and thus Stomper was conceived.
|
|
64
64
|
|
65
65
|
Primary Author:: Ian D. Eccles
|
66
66
|
Source Repository:: http://github.com/iande/stomper
|
67
|
-
Current Version:: 0.3.
|
68
|
-
Last Updated:: 2010-03-
|
67
|
+
Current Version:: 0.3.2
|
68
|
+
Last Updated:: 2010-03-05
|
data/lib/stomper/client.rb
CHANGED
@@ -191,24 +191,30 @@ module Stomper
|
|
191
191
|
# incur some performance penalties depending upon which
|
192
192
|
# Ruby environment this library is used with. The receiver
|
193
193
|
# thread may be stopped by calling the +stop+ instance method.
|
194
|
+
# If the receiver is set to non-blocking (default behavior), the
|
195
|
+
# receiving thread will sleep for a number of seconds specified by the
|
196
|
+
# :receive_delay option between receive calls.
|
197
|
+
#
|
198
|
+
# The +opts+ parameter is a hash of options, and can include:
|
199
|
+
#
|
200
|
+
# [:block] Sets the receiver to either blocking if true (default: false)
|
201
|
+
# [:receive_delay] Sets the delay in seconds between receive calls when the receiver is non-blocking (default: 0.2)
|
194
202
|
#
|
195
203
|
# See also: stop, receiving?
|
196
|
-
def start
|
204
|
+
def start(opts={})
|
197
205
|
@connection.connect unless connected?
|
198
|
-
|
199
|
-
start_thread = false
|
206
|
+
do_start = false
|
200
207
|
@receiver_lock.synchronize do
|
201
|
-
|
202
|
-
start_thread = @run_thread.nil?
|
208
|
+
do_start = !receiving?
|
203
209
|
end
|
204
|
-
if
|
205
|
-
|
210
|
+
if do_start
|
211
|
+
blocking = opts.delete(:block) { false }
|
212
|
+
sleep_time = opts.delete(:receive_delay) { 0.2 }
|
213
|
+
@receiving = true
|
214
|
+
@run_thread = Thread.new(blocking) do |block|
|
206
215
|
while receiving?
|
207
|
-
|
208
|
-
|
209
|
-
# receiving would be better than polling.
|
210
|
-
receive
|
211
|
-
sleep(1.0)
|
216
|
+
receive(block)
|
217
|
+
sleep(sleep_time) unless block
|
212
218
|
end
|
213
219
|
end
|
214
220
|
end
|
@@ -227,13 +233,14 @@ module Stomper
|
|
227
233
|
#
|
228
234
|
# See also: start, receiving?
|
229
235
|
def stop
|
230
|
-
|
236
|
+
do_stop = false
|
231
237
|
@receiver_lock.synchronize do
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
238
|
+
do_stop = receiving?
|
239
|
+
end
|
240
|
+
if do_stop
|
241
|
+
@receiving = false
|
242
|
+
@run_thread.join
|
243
|
+
@run_thread = nil
|
237
244
|
end
|
238
245
|
self
|
239
246
|
end
|
@@ -260,8 +267,8 @@ module Stomper
|
|
260
267
|
# stomp broker.
|
261
268
|
#
|
262
269
|
# See also: Stomper::Subscription
|
263
|
-
def receive
|
264
|
-
msg = @receive_lock.synchronize { @connection.receive }
|
270
|
+
def receive(block=false)
|
271
|
+
msg = @receive_lock.synchronize { @connection.receive(block) }
|
265
272
|
@subscriptions.perform(msg) if msg.is_a?(Stomper::Frames::Message)
|
266
273
|
msg
|
267
274
|
end
|
data/lib/stomper/connection.rb
CHANGED
@@ -29,14 +29,16 @@ module Stomper
|
|
29
29
|
def initialize(uri, opts = {})
|
30
30
|
connect_now = opts.delete(:connect_now) { true }
|
31
31
|
@uri = (uri.is_a?(URI) && uri) || URI.parse(uri)
|
32
|
-
@uri.port = (@uri.scheme == "stomp+ssl") ? 61612 : 61613 if @uri.port.nil?
|
33
|
-
@uri.host = 'localhost' if @uri.host.nil?
|
34
|
-
@uri.freeze
|
35
32
|
@use_ssl = (@uri.scheme == "stomp+ssl")
|
33
|
+
@uri.host ||= 'localhost'
|
36
34
|
if @use_ssl
|
35
|
+
@uri.port ||= 61612
|
37
36
|
@ssl_context = OpenSSL::SSL::SSLContext.new
|
38
37
|
@ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
38
|
+
else
|
39
|
+
@uri.port ||= 61613
|
39
40
|
end
|
41
|
+
@uri.freeze
|
40
42
|
@connected = false
|
41
43
|
connect if connect_now
|
42
44
|
end
|
@@ -48,13 +50,13 @@ module Stomper
|
|
48
50
|
#
|
49
51
|
# See also: new
|
50
52
|
def connect
|
51
|
-
|
53
|
+
stomp_socket = TCPSocket.open(@uri.host, @uri.port)
|
52
54
|
if @use_ssl
|
53
|
-
|
54
|
-
|
55
|
-
|
55
|
+
stomp_socket = OpenSSL::SSL::SSLSocket.new(stomp_socket, @ssl_context)
|
56
|
+
stomp_socket.sync_close = true
|
57
|
+
stomp_socket.connect
|
56
58
|
end
|
57
|
-
@socket =
|
59
|
+
@socket = stomp_socket
|
58
60
|
transmit Stomper::Frames::Connect.new(@uri.user, @uri.password)
|
59
61
|
# Block until the first frame is received
|
60
62
|
connect_frame = receive(true)
|
@@ -155,22 +157,11 @@ module Stomper
|
|
155
157
|
end
|
156
158
|
|
157
159
|
def socket_c_to_i(c)
|
158
|
-
|
159
|
-
def socket_c_to_i(char); char.ord; end
|
160
|
-
c.ord
|
161
|
-
else
|
162
|
-
def socket_c_to_i(char); char; end
|
163
|
-
c
|
164
|
-
end
|
160
|
+
(c.respond_to?(:ord)) ? c.ord : c
|
165
161
|
end
|
162
|
+
|
166
163
|
def socket_c_to_chr(c)
|
167
|
-
|
168
|
-
def socket_c_to_chr(char); char.chr; end
|
169
|
-
c.chr
|
170
|
-
else
|
171
|
-
def socket_c_to_chr(char); char; end
|
172
|
-
c
|
173
|
-
end
|
164
|
+
(c.respond_to?(:chr)) ? c.chr : c
|
174
165
|
end
|
175
166
|
end
|
176
167
|
end
|
data/spec/client_spec.rb
CHANGED
@@ -83,6 +83,16 @@ module Stomper
|
|
83
83
|
@client.stop
|
84
84
|
@client.receiving?.should be_false
|
85
85
|
end
|
86
|
+
it "should allow for a blocking threaded receiver" do
|
87
|
+
@mock_connection.should_receive(:receive).with(true).at_least(:once).and_return(nil)
|
88
|
+
@mock_connection.should_receive(:connected?).any_number_of_times.and_return(true)
|
89
|
+
@client.receiving?.should be_false
|
90
|
+
@client.start(:block => true)
|
91
|
+
@client.receiving?.should be_true
|
92
|
+
@client.stop
|
93
|
+
@client.receiving?.should be_false
|
94
|
+
end
|
95
|
+
|
86
96
|
end
|
87
97
|
|
88
98
|
describe "subscribing to queue" do
|
data/spec/connection_spec.rb
CHANGED
@@ -4,7 +4,7 @@ require File.expand_path(File.join(File.dirname(__FILE__), 'shared_connection_ex
|
|
4
4
|
module Stomper
|
5
5
|
describe Connection do
|
6
6
|
before(:each) do
|
7
|
-
@connection = Connection.new("stomp:///")
|
7
|
+
@connection = Connection.new("stomp:///", :connect_now => false)
|
8
8
|
end
|
9
9
|
|
10
10
|
it_should_behave_like "All Client Connections"
|
@@ -2,27 +2,27 @@ shared_examples_for "All Client Connections" do
|
|
2
2
|
describe "connection initializers" do
|
3
3
|
describe "from uri" do
|
4
4
|
it "should accept the stomp:/// uri (no host specified)" do
|
5
|
-
lambda { @connection.class.new("stomp:///") }.should_not raise_error
|
5
|
+
lambda { @connection.class.new("stomp:///", :connect_now => false) }.should_not raise_error
|
6
6
|
end
|
7
7
|
|
8
8
|
it "should accept a uri specifying just the host" do
|
9
|
-
lambda { @connection.class.new("stomp://localhost/") }.should_not raise_error
|
9
|
+
lambda { @connection.class.new("stomp://localhost/", :connect_now => false) }.should_not raise_error
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should accept a uri specifying host and port" do
|
13
|
-
lambda { @connection.class.new("stomp://localhost:61613/") }.should_not raise_error
|
13
|
+
lambda { @connection.class.new("stomp://localhost:61613/", :connect_now => false) }.should_not raise_error
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should accept a uri specifying host, port and credentials" do
|
17
|
-
lambda { @connection.class.new("stomp://test_user:s3cr3tz@localhost:61613/") }.should_not raise_error
|
17
|
+
lambda { @connection.class.new("stomp://test_user:s3cr3tz@localhost:61613/", :connect_now => false) }.should_not raise_error
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should accept a uri specifying a secure connection" do
|
21
|
-
lambda { @connection.class.new("stomp+ssl://localhost") }.should_not raise_error
|
21
|
+
lambda { @connection.class.new("stomp+ssl://localhost", :connect_now => false) }.should_not raise_error
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should not accept a bogus URI" do
|
25
|
-
lambda { @connection.class.new("stomp://localhost:garbage") }.should raise_error
|
25
|
+
lambda { @connection.class.new("stomp://localhost:garbage", :connect_now => false) }.should raise_error
|
26
26
|
end
|
27
27
|
|
28
28
|
end
|
@@ -69,7 +69,7 @@ shared_examples_for "All Client Connections" do
|
|
69
69
|
|
70
70
|
describe "secure connection" do
|
71
71
|
before(:each) do
|
72
|
-
@secure_connection = @connection.class.new("stomp+ssl:///")
|
72
|
+
@secure_connection = @connection.class.new("stomp+ssl:///", :connect_now => false)
|
73
73
|
end
|
74
74
|
it "should transmit frames" do
|
75
75
|
@connection.connect
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
8
|
+
- 2
|
9
|
+
version: 0.3.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ian D. Eccles
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-05 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|