torquebox-messaging 1.0.0.CR1-java

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.
Files changed (51) hide show
  1. data/lib/acl-spi-3.0.0.CR2.jar +0 -0
  2. data/lib/activation-1.1.jar +0 -0
  3. data/lib/authorization-spi-3.0.0.CR2.jar +0 -0
  4. data/lib/dtdparser-1.21.jar +0 -0
  5. data/lib/gem_hook.rb +22 -0
  6. data/lib/hornetq-core-2.1.2.Final.jar +0 -0
  7. data/lib/hornetq-jms-client-2.1.2.Final.jar +0 -0
  8. data/lib/hornetq-logging-2.1.2.Final.jar +0 -0
  9. data/lib/identity-spi-3.0.0.CR2.jar +0 -0
  10. data/lib/jaxb-api-2.1.9.jar +0 -0
  11. data/lib/jboss-common-core-2.2.17.GA.jar +0 -0
  12. data/lib/jboss-jms-api_1.1_spec-1.0.0.Final.jar +0 -0
  13. data/lib/jboss-logging-3.0.0.Beta4.jar +0 -0
  14. data/lib/jboss-reflect-2.2.0.GA.jar +0 -0
  15. data/lib/jbosssx-bare-3.0.0.CR2.jar +0 -0
  16. data/lib/jbossxacml-2.0.5.CR1.jar +0 -0
  17. data/lib/jbossxb-2.0.3.GA.jar +0 -0
  18. data/lib/jnp-client-5.0.5.Final.jar +0 -0
  19. data/lib/jruby-complete-1.6.1.jar +0 -0
  20. data/lib/netty-3.2.1.Final.jar +0 -0
  21. data/lib/org.torquebox.messaging-client.rb +20 -0
  22. data/lib/picketbox-acl-impl-3.0.0.CR2.jar +0 -0
  23. data/lib/picketbox-bare-3.0.0.CR2.jar +0 -0
  24. data/lib/picketbox-identity-impl-3.0.0.CR2.jar +0 -0
  25. data/lib/picketbox-spi-bare-3.0.0.CR2.jar +0 -0
  26. data/lib/torquebox/messaging/backgroundable.rb +134 -0
  27. data/lib/torquebox/messaging/client.rb +74 -0
  28. data/lib/torquebox/messaging/destination.rb +173 -0
  29. data/lib/torquebox/messaging/ext/javax_jms_queue_browser.rb +27 -0
  30. data/lib/torquebox/messaging/ext/javax_jms_session.rb +142 -0
  31. data/lib/torquebox/messaging/task.rb +46 -0
  32. data/lib/torquebox/messaging.rb +6 -0
  33. data/lib/torquebox-base-core.jar +0 -0
  34. data/lib/torquebox-base-metadata.jar +0 -0
  35. data/lib/torquebox-base-spi.jar +0 -0
  36. data/lib/torquebox-mc-support.jar +0 -0
  37. data/lib/torquebox-messaging-core.jar +0 -0
  38. data/lib/torquebox-messaging.jar +0 -0
  39. data/lib/torquebox-messaging.rb +43 -0
  40. data/lib/xercesImpl-2.9.1.jar +0 -0
  41. data/lib/xml-apis-1.3.04.jar +0 -0
  42. data/licenses/lgpl-2.1.txt +504 -0
  43. data/spec/backgroundable_spec.rb +141 -0
  44. data/spec/client_spec.rb +119 -0
  45. data/spec/destination_spec.rb +296 -0
  46. data/spec/dispatcher-queues.yml +4 -0
  47. data/spec/dispatcher_not_running.rb +54 -0
  48. data/spec/ext/java_jmx_session_spec.rb +71 -0
  49. data/spec/queues.yml +6 -0
  50. data/spec/task_spec.rb +66 -0
  51. metadata +163 -0
@@ -0,0 +1,141 @@
1
+ require 'torquebox/messaging/backgroundable'
2
+
3
+ class MyTestModel
4
+ include TorqueBox::Messaging::Backgroundable
5
+
6
+ def an_async_action(arg1, arg2)
7
+ a_sync_action
8
+ end
9
+ always_background :an_async_action
10
+
11
+ def a_sync_action; end
12
+ def foo; end
13
+ def bar; end
14
+ def optioned; end
15
+ def redefine_me; end
16
+ end
17
+
18
+ describe TorqueBox::Messaging::Backgroundable do
19
+ before(:all) do
20
+ @util = TorqueBox::Messaging::Backgroundable::Util
21
+ end
22
+
23
+ describe "always_background" do
24
+ it "should be able to handle mutliple methods" do
25
+ MyTestModel.always_background :foo, :bar
26
+ @util.instance_methods_include?(MyTestModel, '__async_foo').should be_true
27
+ @util.instance_methods_include?(MyTestModel, '__async_bar').should be_true
28
+ end
29
+
30
+ it "should handle methods that are defined after the always_background call" do
31
+ MyTestModel.always_background :baz
32
+ @util.instance_methods_include?(MyTestModel, '__async_baz').should_not be_true
33
+ MyTestModel.class_eval('def baz;end')
34
+ @util.instance_methods_include?(MyTestModel, '__async_baz').should be_true
35
+ end
36
+
37
+ it "should handle methods that are redefined after the always_background call" do
38
+ MyTestModel.always_background :redefine_me
39
+ MyTestModel.class_eval('def redefine_me; :xyz; end')
40
+ MyTestModel.new.__sync_redefine_me.should == :xyz
41
+ end
42
+
43
+ it "should work for private methods, maintaining visibility" do
44
+ MyTestModel.class_eval('private; def no_peeking;end')
45
+ MyTestModel.always_background :no_peeking
46
+ @util.private_instance_methods_include?(MyTestModel, 'no_peeking').should be_true
47
+ @util.private_instance_methods_include?(MyTestModel, '__async_no_peeking').should be_true
48
+ @util.private_instance_methods_include?(MyTestModel, '__sync_no_peeking').should be_true
49
+ end
50
+
51
+ it "should work for protected methods, maintaining visibility" do
52
+ MyTestModel.class_eval('protected; def some_peeking;end')
53
+ MyTestModel.always_background :some_peeking
54
+ @util.protected_instance_methods_include?(MyTestModel, 'some_peeking').should be_true
55
+ @util.protected_instance_methods_include?(MyTestModel, '__async_some_peeking').should be_true
56
+ @util.protected_instance_methods_include?(MyTestModel, '__sync_some_peeking').should be_true
57
+ end
58
+ end
59
+
60
+ describe "a method handled asynchronously" do
61
+ before(:each) do
62
+ @queue = mock('queue')
63
+ @queue.stub(:publish)
64
+ TorqueBox::Messaging::Queue.stub(:new).and_return(@queue)
65
+ end
66
+
67
+ it "should put a message on the queue" do
68
+ @queue.should_receive(:publish)
69
+ MyTestModel.new.an_async_action(nil, nil)
70
+ end
71
+
72
+ it "should include the receiver, sync method, and args" do
73
+ object = MyTestModel.new
74
+ @queue.should_receive(:publish).with({:receiver => object, :method => '__sync_an_async_action', :args => [:a, :b]}, { })
75
+ object.an_async_action(:a, :b)
76
+ end
77
+
78
+ it "should not call the action immediately" do
79
+ object = MyTestModel.new
80
+ object.should_not_receive(:a_sync_action)
81
+ object.an_async_action(nil, nil)
82
+ end
83
+
84
+ it "should pass through the options" do
85
+ MyTestModel.always_background :optioned, :priority => :low
86
+ @queue.should_receive(:publish).with(anything, :priority => :low)
87
+ MyTestModel.new.optioned
88
+ end
89
+
90
+ end
91
+
92
+ describe 'background' do
93
+ before(:each) do
94
+ @queue = mock('queue')
95
+ @queue.stub(:publish)
96
+ TorqueBox::Messaging::Queue.stub(:new).and_return(@queue)
97
+ @object = MyTestModel.new
98
+ end
99
+
100
+ it "should queue any method called on it" do
101
+ @queue.should_receive(:publish).with({:receiver => anything,
102
+ :method => :foo,
103
+ :args => anything}, { })
104
+ @object.background.foo
105
+ end
106
+
107
+ it "should queue the receiver" do
108
+ @queue.should_receive(:publish).with({:receiver => @object,
109
+ :method => anything,
110
+ :args => anything}, { })
111
+ @object.background.foo
112
+ end
113
+
114
+ it "should queue the args" do
115
+ @queue.should_receive(:publish).with({:receiver => anything,
116
+ :method => anything,
117
+ :args => [1,2]}, {})
118
+ @object.background.foo(1,2)
119
+ end
120
+
121
+ it "should raise when given a block" do
122
+ lambda {
123
+ @object.background.foo { }
124
+ }.should raise_error(ArgumentError)
125
+ end
126
+
127
+ it "should handle missing methods" do
128
+ @object.should_receive(:method_missing)
129
+ @object.background.no_method
130
+ end
131
+
132
+ it "should pass through any options" do
133
+ @queue.should_receive(:publish).with({:receiver => anything,
134
+ :method => anything,
135
+ :args => anything},
136
+ {:ttl => 1})
137
+ @object.background(:ttl => 1).foo
138
+ end
139
+ end
140
+
141
+ end
@@ -0,0 +1,119 @@
1
+
2
+
3
+ require 'torquebox-messaging-container'
4
+ require 'torquebox-naming-container'
5
+ require 'torquebox-container-foundation'
6
+
7
+ require 'torquebox/messaging/client'
8
+
9
+ describe TorqueBox::Messaging::Client do
10
+
11
+ describe "sending and receiving" do
12
+ before(:each) do
13
+ @container = TorqueBox::Container::Foundation.new
14
+ @container.enable( TorqueBox::Naming::NamingService ) {|config| config.export=false}
15
+ @container.enable( TorqueBox::Messaging::MessageBroker )
16
+ @container.start
17
+
18
+ @queues_yml = @container.deploy( File.join( File.dirname(__FILE__), 'queues.yml' ) )
19
+ @container.process_deployments(true)
20
+ end
21
+
22
+ after(:each) do
23
+ @container.undeploy( @queues_yml )
24
+ @container.stop
25
+ end
26
+
27
+ it "should be able to send to a queue from two threads/two sessions" do
28
+
29
+ received_message = nil
30
+
31
+ consumer_thread = Thread.new {
32
+ TorqueBox::Messaging::Client.connect() do |session|
33
+ received_message = session.receive( '/queues/foo' )
34
+ session.commit
35
+ end
36
+ }
37
+
38
+ producer_thread = Thread.new {
39
+ TorqueBox::Messaging::Client.connect() do |session|
40
+ session.publish( '/queues/foo', "howdy" )
41
+ session.commit
42
+ end
43
+ }
44
+
45
+ consumer_thread.join
46
+
47
+ received_message.should_not be_nil
48
+ received_message.should eql( "howdy" )
49
+ end
50
+
51
+
52
+ it "should be able to send to a queue from one thread/one session" do
53
+
54
+ received_message = nil
55
+
56
+ TorqueBox::Messaging::Client.connect() do |session|
57
+ session.publish( '/queues/foo', "howdy" )
58
+ session.commit
59
+ received_message = session.receive( '/queues/foo' )
60
+ session.commit
61
+ end
62
+
63
+ received_message.should_not be_nil
64
+ received_message.should eql( "howdy" )
65
+ end
66
+
67
+ it "should be able to send and receive a non-String message" do
68
+ message = {:string => "a string", :symbol => :a_symbol, :hash => {}, :array => []}
69
+ received_message = nil
70
+
71
+ TorqueBox::Messaging::Client.connect() do |session|
72
+ session.publish( '/queues/foo', message )
73
+ session.commit
74
+ received_message = session.receive( '/queues/foo' )
75
+ session.commit
76
+ end
77
+
78
+ received_message.should_not be_nil
79
+ received_message.should eql( message )
80
+ end
81
+
82
+ it "should identify a non-String message with a text property" do
83
+ received_message = nil
84
+ TorqueBox::Messaging::Client.connect() do |session|
85
+ session.publish( '/queues/foo', [] )
86
+ session.commit
87
+ received_message = session.receive( '/queues/foo', :decode => false )
88
+ session.commit
89
+ end
90
+ received_message.decode.should eql( [] )
91
+ received_message.get_string_property( 'torquebox_encoding' ).should eql( 'base64' )
92
+ end
93
+
94
+ it "should not identify a String message with a text property" do
95
+ received_message = nil
96
+ TorqueBox::Messaging::Client.connect() do |session|
97
+ session.publish( '/queues/foo', "foo" )
98
+ session.commit
99
+ received_message = session.receive( '/queues/foo', :decode => false )
100
+ session.commit
101
+ end
102
+ received_message.text.should eql( "foo" )
103
+ received_message.decode.should eql( "foo" )
104
+ received_message.get_string_property( 'torquebox_encoding' ).should be_nil
105
+ end
106
+
107
+ it "should timeout if asked" do
108
+ received_message = nil
109
+ TorqueBox::Messaging::Client.connect() do |session|
110
+ received_message = session.receive( '/queues/foo', :timeout => 1 )
111
+ end
112
+ received_message.should be_nil
113
+ end
114
+
115
+ end
116
+
117
+ end
118
+
119
+
@@ -0,0 +1,296 @@
1
+
2
+ require 'torquebox-container-foundation'
3
+ require 'torquebox-naming-container'
4
+ require 'torquebox-messaging-container'
5
+ require 'torquebox/messaging/destination'
6
+
7
+ describe TorqueBox::Messaging::Destination do
8
+
9
+ it "should return its name for to_s" do
10
+ queue = TorqueBox::Messaging::Queue.new("/queues/foo")
11
+ queue.name.should == "/queues/foo"
12
+ queue.to_s.should == queue.name
13
+ topic = TorqueBox::Messaging::Topic.new("/topics/bar")
14
+ topic.name.should == "/topics/bar"
15
+ topic.to_s.should == topic.name
16
+ end
17
+
18
+ %w{ create start }.each do |method|
19
+
20
+ it "should create a queue on #{method}" do
21
+ server = mock("server")
22
+ server.should_receive(:createQueue)
23
+ server.should_receive(:destroyQueue).with("my_queue")
24
+ TorqueBox::Kernel.stub!(:lookup).with("JMSServerManager").and_yield(server)
25
+
26
+ queue = TorqueBox::Messaging::Queue.new("my_queue")
27
+ queue.name.should eql("my_queue")
28
+ queue.send method
29
+ queue.destroy
30
+ end
31
+
32
+ it "should create a topic on #{method}" do
33
+ server = mock("server")
34
+ server.should_receive(:createTopic)
35
+ server.should_receive(:destroyTopic).with("my_topic")
36
+ TorqueBox::Kernel.stub!(:lookup).with("JMSServerManager").and_yield(server)
37
+
38
+ topic = TorqueBox::Messaging::Topic.new("my_topic")
39
+ topic.name.should eql("my_topic")
40
+ topic.send method
41
+ topic.destroy
42
+ end
43
+
44
+ end
45
+
46
+ describe "publish" do
47
+ before(:each) do
48
+ @session = mock('session')
49
+ @session.stub(:transacted?).and_return(false)
50
+ TorqueBox::Messaging::Client.stub(:connect).and_yield(@session)
51
+ @queue = TorqueBox::Messaging::Queue.new('foo')
52
+ end
53
+
54
+ context "normalizing options" do
55
+ context "priority" do
56
+ {
57
+ :low => 1,
58
+ :normal => 4,
59
+ :high => 7,
60
+ :critical => 9
61
+ }.each do |symbol, level|
62
+ it "should normalize :#{symbol} to #{level}" do
63
+ @session.should_receive(:publish).with(anything, anything, { :priority => level })
64
+ @queue.publish('message', { :priority => symbol })
65
+ end
66
+ end
67
+
68
+ it "should pass through valid integer priorities" do
69
+ @session.should_receive(:publish).with(anything, anything, { :priority => 5 })
70
+ @queue.publish('message', { :priority => 5 })
71
+ end
72
+
73
+ it "should pass through valid integer-as-string priorities" do
74
+ @session.should_receive(:publish).with(anything, anything, { :priority => 5 })
75
+ @queue.publish('message', { :priority => "5" })
76
+ end
77
+
78
+ it "should raise on an invalid integer" do
79
+ lambda {
80
+ @queue.publish('message', { :priority => -1 })
81
+ }.should raise_error(ArgumentError)
82
+ end
83
+ end
84
+
85
+ it "should handle persistence = true" do
86
+ @session.should_receive(:publish).with(anything, anything, { :delivery_mode => javax.jms::DeliveryMode.PERSISTENT })
87
+ @queue.publish('message', { :persistent => true })
88
+ end
89
+
90
+ it "should handle persistence = false" do
91
+ @session.should_receive(:publish).with(anything, anything, { :delivery_mode => javax.jms::DeliveryMode.NON_PERSISTENT })
92
+ @queue.publish('message', { :persistent => false })
93
+ end
94
+ end
95
+ end
96
+
97
+
98
+ describe "message selectors" do
99
+ before(:each) do
100
+ @container = TorqueBox::Container::Foundation.new
101
+ @container.enable( TorqueBox::Naming::NamingService ) {|config| config.export=false}
102
+ @container.enable( TorqueBox::Messaging::MessageBroker )
103
+ @container.start
104
+ @queue = TorqueBox::Messaging::Queue.new "/queues/selector_test"
105
+ @queue.start
106
+ end
107
+
108
+ after(:each) do
109
+ @queue.destroy
110
+ @container.stop
111
+ end
112
+
113
+ {
114
+ true => 'prop = true',
115
+ true => 'prop <> false',
116
+ 5 => 'prop = 5',
117
+ 5 => 'prop > 4',
118
+ 5.5 => 'prop = 5.5',
119
+ 5.5 => 'prop < 6',
120
+ 'string' => "prop = 'string'"
121
+ }.each do |value, selector|
122
+ it "should be able to select with property set to #{value} using selector '#{selector}'" do
123
+ @queue.publish value.to_s, :properties => { :prop => value }
124
+ message = @queue.receive(:timeout => 1000, :selector => selector)
125
+ message.should == value.to_s
126
+ end
127
+ end
128
+
129
+ end
130
+
131
+ describe "browse" do
132
+ before(:each) do
133
+ @container = TorqueBox::Container::Foundation.new
134
+ @container.enable( TorqueBox::Naming::NamingService ) {|config| config.export=false}
135
+ @container.enable( TorqueBox::Messaging::MessageBroker )
136
+ @container.start
137
+ end
138
+
139
+ after(:each) do
140
+ @container.stop
141
+ end
142
+
143
+ it "should allow enumeration of the messages" do
144
+ queue = TorqueBox::Messaging::Queue.new "/queues/browseable"
145
+ queue.start
146
+ queue.publish "howdy"
147
+ queue.first.text.should == 'howdy'
148
+ queue.destroy
149
+ end
150
+
151
+ it "should accept a selector" do
152
+ queue = TorqueBox::Messaging::Queue.new "/queues/browseable", {}, :selector => 'blurple > 5'
153
+ queue.start
154
+ queue.publish "howdy", :properties => {:blurple => 5}
155
+ queue.publish "ahoyhoy", :properties => {:blurple => 6}
156
+ queue.first.text.should == 'ahoyhoy'
157
+ queue.detect { |m| m.text == 'howdy' }.should be_nil
158
+ queue.destroy
159
+
160
+ end
161
+ end
162
+
163
+ describe "sending and receiving" do
164
+ before(:each) do
165
+ @container = TorqueBox::Container::Foundation.new
166
+ @container.enable( TorqueBox::Naming::NamingService ) {|config| config.export=false}
167
+ @container.enable( TorqueBox::Messaging::MessageBroker )
168
+ @container.start
169
+ end
170
+
171
+ after(:each) do
172
+ @container.stop
173
+ end
174
+
175
+ it "should be able to publish to and receive from a queue" do
176
+ queue = TorqueBox::Messaging::Queue.new "/queues/foo"
177
+ queue.start
178
+
179
+ queue.publish "howdy"
180
+ message = queue.receive
181
+
182
+ queue.destroy
183
+ message.should eql( "howdy" )
184
+ end
185
+
186
+ it "should publish to multiple topic consumers" do
187
+ topic = TorqueBox::Messaging::Topic.new "/topics/foo"
188
+ topic.start
189
+ threads, count = [], 10
190
+
191
+ # Use a threadsafe "array"
192
+ msgs = java.util.Collections.synchronizedList( [] )
193
+
194
+ # Ensure all clients are blocking on the receipt of a message
195
+ count.times { threads << Thread.new { msgs << topic.receive } }
196
+ sleep(1)
197
+ topic.publish "howdy"
198
+ threads.each {|t| t.join}
199
+
200
+ topic.destroy
201
+ msgs.to_a.should eql( ["howdy"] * count )
202
+ end
203
+
204
+ context "synchronous messaging" do
205
+ it "should return value of block given to receive_and_publish" do
206
+ queue = TorqueBox::Messaging::Queue.new "/queues/publish_and_receive"
207
+ queue.start
208
+
209
+ response_thread = Thread.new {
210
+ queue.receive_and_publish( :timeout => 10000 ) { |msg| msg.upcase }
211
+ }
212
+ message = queue.publish_and_receive "ping", :timeout => 10000
213
+ response_thread.join
214
+
215
+ queue.destroy
216
+ message.should eql( "PING" )
217
+ end
218
+
219
+ it "should return request message if no block given" do
220
+ queue = TorqueBox::Messaging::Queue.new "/queues/publish_and_receive"
221
+ queue.start
222
+
223
+ response_thread = Thread.new {
224
+ queue.receive_and_publish( :timeout => 10000 )
225
+ }
226
+ message = queue.publish_and_receive "ping", :timeout => 10000
227
+ response_thread.join
228
+
229
+ queue.destroy
230
+ message.should eql( "ping" )
231
+ end
232
+
233
+ it "should not mess up with multiple consumers" do
234
+ queue = TorqueBox::Messaging::Queue.new "/queues/publish_and_receive"
235
+ queue.start
236
+
237
+ thread_count = 3
238
+ response_threads = (1..thread_count).map do
239
+ Thread.new {
240
+ queue.receive_and_publish( :timeout => 10000 ) { |msg| msg.upcase }
241
+ }
242
+ end
243
+
244
+ message = queue.publish_and_receive "ping", :timeout => 10000
245
+ # Send extra messages to trigger all remaining response threads
246
+ (thread_count - 1).times do
247
+ queue.publish_and_receive "ping", :timeout => 10000
248
+ end
249
+ response_threads.each { |thread| thread.join }
250
+
251
+ queue.destroy
252
+ message.should eql( "PING" )
253
+ end
254
+ end
255
+
256
+ context "destination not ready" do
257
+ it "should block on publish until queue is ready" do
258
+ queue = TorqueBox::Messaging::Queue.new "/queues/not_ready"
259
+ # Start the queue in a separate thread after a delay
260
+ setup_thread = Thread.new {
261
+ sleep( 0.2 )
262
+ queue.start
263
+ }
264
+ # The queue will not be ready when we call the publish method
265
+ queue.publish "something"
266
+ message = queue.receive
267
+
268
+ setup_thread.join
269
+ queue.destroy
270
+ message.should eql( "something" )
271
+ end
272
+
273
+ it "should block on receive until topic is ready" do
274
+ topic = TorqueBox::Messaging::Topic.new "/topics/not_ready"
275
+ # Start the topic in a separate thread after a delay
276
+ setup_thread = Thread.new {
277
+ topic.start
278
+ }
279
+ # The topic will not be ready when we call the receive method
280
+ message = topic.receive :timeout => 200
281
+
282
+ setup_thread.join
283
+ topic.destroy
284
+ message.should be_nil
285
+ end
286
+
287
+ it "should block until startup_timeout reached" do
288
+ queue = TorqueBox::Messaging::Queue.new "/queues/not_ready"
289
+ lambda {
290
+ queue.publish "something", :startup_timeout => 200
291
+ }.should raise_error(javax.naming.NameNotFoundException)
292
+ end
293
+ end
294
+ end
295
+
296
+ end
@@ -0,0 +1,4 @@
1
+
2
+ /queues/questions:
3
+
4
+ /queues/answers:
@@ -0,0 +1,54 @@
1
+ #require 'spec_helper'
2
+
3
+ require 'rubygems'
4
+ require 'torquebox-naming'
5
+ require 'torquebox-naming-container'
6
+ require 'torquebox-messaging-container'
7
+ require 'torquebox/messaging/message_processor'
8
+ require 'torquebox/messaging/destination'
9
+
10
+ QUEUE_QUESTIONS = TorqueBox::Messaging::Queue.new("/queues/questions")
11
+ QUEUE_ANSWERS = TorqueBox::Messaging::Queue.new("/queues/answers")
12
+
13
+ TESTING_ON_WINDOWS = ( java.lang::System.getProperty( "os.name" ) =~ /.*windows*/i )
14
+
15
+ class Upcaser < TorqueBox::Messaging::MessageProcessor
16
+ def on_message(body)
17
+ QUEUE_ANSWERS.publish( body.upcase )
18
+ end
19
+ end
20
+
21
+ describe "dispatcher test" do
22
+ before(:each) do
23
+ @container = TorqueBox::Container::Foundation.new
24
+ @container.enable( TorqueBox::Naming::NamingService ) {|config| config.export=true}
25
+ @container.enable( TorqueBox::Messaging::MessageBroker )
26
+ @container.start
27
+
28
+ @queues_yml = @container.deploy( File.join( File.dirname(__FILE__), 'dispatcher-queues.yml' ) )
29
+ @container.process_deployments(true)
30
+ puts "Deployed queues"
31
+ end
32
+
33
+ after(:each) do
34
+ puts "UNDEPLOY queues"
35
+ @container.undeploy( @queues_yml )
36
+ puts "UNDEPLOYED queues"
37
+ puts "STOP container"
38
+ @container.stop
39
+ puts "STOPPED container"
40
+ end
41
+
42
+ unless TESTING_ON_WINDOWS
43
+ it "should associate a processor with a queue" do
44
+ dispatcher = TorqueBox::Messaging::Dispatcher.new( :skip_naming=>true ) do
45
+ map Upcaser, QUEUE_QUESTIONS
46
+ end
47
+ dispatcher.start
48
+ QUEUE_QUESTIONS.publish "lkjsdf"
49
+ QUEUE_ANSWERS.receive(:timeout => 2000).should == "LKJSDF"
50
+ dispatcher.stop
51
+ end
52
+ end
53
+
54
+ end
@@ -0,0 +1,71 @@
1
+ require 'torquebox/messaging/ext/javax_jms_session'
2
+
3
+ describe javax.jms::Session do
4
+
5
+ before(:each) do
6
+ @session = javax.jms::Session.new
7
+ end
8
+
9
+ describe ".populate_message_properties" do
10
+ it "should do nothing if no properties are submitted" do
11
+ jms_message = mock('JMSMessage')
12
+ jms_message.should_not_receive(:setStringProperty)
13
+
14
+ @session.populate_message_properties jms_message, nil
15
+ end
16
+
17
+ it "should register properties with String keys" do
18
+ properties = {'abc' => 'def'}
19
+
20
+ jms_message = mock('JMSMessage')
21
+ jms_message.should_receive(:set_string_property).with('abc', 'def')
22
+
23
+ @session.populate_message_properties jms_message, properties
24
+ end
25
+
26
+ it "should register properties with Symbol keys" do
27
+ properties = {:abc => :def}
28
+
29
+ jms_message = mock('JMSMessage')
30
+ jms_message.should_receive(:set_string_property).with('abc', 'def')
31
+
32
+ @session.populate_message_properties jms_message, properties
33
+ end
34
+
35
+ it "should register true as a boolean" do
36
+ properties = {:abc => true}
37
+
38
+ jms_message = mock('JMSMessage')
39
+ jms_message.should_receive(:set_boolean_property).with('abc', true)
40
+
41
+ @session.populate_message_properties jms_message, properties
42
+ end
43
+
44
+ it "should register false as a boolean" do
45
+ properties = {:abc => false}
46
+
47
+ jms_message = mock('JMSMessage')
48
+ jms_message.should_receive(:set_boolean_property).with('abc', false)
49
+
50
+ @session.populate_message_properties jms_message, properties
51
+ end
52
+
53
+ it "should register 5 as an long" do
54
+ properties = {:abc => 5}
55
+
56
+ jms_message = mock('JMSMessage')
57
+ jms_message.should_receive(:set_long_property).with('abc', 5)
58
+
59
+ @session.populate_message_properties jms_message, properties
60
+ end
61
+
62
+ it "should register 5.5 as a double" do
63
+ properties = {:abc => 5.5}
64
+
65
+ jms_message = mock('JMSMessage')
66
+ jms_message.should_receive(:set_double_property).with('abc', 5.5)
67
+
68
+ @session.populate_message_properties jms_message, properties
69
+ end
70
+ end
71
+ end
data/spec/queues.yml ADDED
@@ -0,0 +1,6 @@
1
+
2
+ /queues/foo:
3
+ durable: false
4
+
5
+ /queues/bar:
6
+ durable: false