jruby-jms 0.9.0 → 0.10.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.
- data/README.md +46 -63
- data/Rakefile +12 -1
- data/examples/jms.yml +10 -2
- data/lib/jms.rb +1 -7
- data/lib/jms/connection.rb +128 -98
- data/lib/jms/javax_jms_session.rb +221 -48
- data/lib/jms/logger.rb +4 -0
- data/lib/jms/logging.rb +29 -0
- data/lib/jms/message_listener.rb +79 -0
- data/test/connection_test.rb +155 -0
- data/test/jms.yml +38 -0
- data/test/session_test.rb +184 -0
- metadata +18 -7
- data/examples/log4j.properties +0 -31
data/README.md
CHANGED
@@ -5,11 +5,6 @@ jruby-jms
|
|
5
5
|
|
6
6
|
### Current Activities & Backward Compatibility
|
7
7
|
|
8
|
-
Currently reviewing Logging which uses Apache Commons logging by default.
|
9
|
-
For now add the following Apache Commons and log4j libraries to your classpath
|
10
|
-
* commons-logging-1.1.1.jar
|
11
|
-
* log4j-1.2.16.jar
|
12
|
-
|
13
8
|
Please read the source files for now for documentation. Looking into rdoc doc
|
14
9
|
generation issue.
|
15
10
|
|
@@ -18,13 +13,12 @@ There may still be some changes to the API to make things better and/or simpler.
|
|
18
13
|
Once the code goes to V1.0.0 I will make every effort to not break the
|
19
14
|
existing interface in any way.
|
20
15
|
|
21
|
-
Feedback is welcome and appreciated :)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
*
|
26
|
-
|
27
|
-
* Need to get rdoc working for
|
16
|
+
### Feedback is welcome and appreciated :)
|
17
|
+
|
18
|
+
### Todo
|
19
|
+
|
20
|
+
* Need to get rdoc working
|
21
|
+
* More tests, especially pub/sub
|
28
22
|
|
29
23
|
### Introduction
|
30
24
|
|
@@ -47,7 +41,7 @@ API is available to you at any time.
|
|
47
41
|
|
48
42
|
### Install
|
49
43
|
|
50
|
-
|
44
|
+
gem install jruby-jms
|
51
45
|
|
52
46
|
### Simplification
|
53
47
|
|
@@ -106,58 +100,46 @@ topic they are interested in
|
|
106
100
|
Producers write message to a queue or topic
|
107
101
|
|
108
102
|
ActiveMQ Example:
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
}
|
126
|
-
|
127
|
-
JMS::Connection.session(config) do |session|
|
128
|
-
session.producer(:q_name => 'ExampleQueue') do |producer|
|
129
|
-
producer.send(session.message("Hello World"))
|
103
|
+
require 'rubygems'
|
104
|
+
|
105
|
+
# Include JMS after ActiveMQ
|
106
|
+
require 'jms'
|
107
|
+
|
108
|
+
# Connect to ActiveMQ
|
109
|
+
config = {
|
110
|
+
:factory => 'org.apache.activemq.ActiveMQConnectionFactory',
|
111
|
+
:broker_url => 'tcp://localhost:61616',
|
112
|
+
:require_jars => ["~/Applications/apache-activemq-5.4.2/activemq-all-5.4.2.jar"]
|
113
|
+
}
|
114
|
+
|
115
|
+
JMS::Connection.session(config) do |session|
|
116
|
+
session.producer(:q_name => 'ExampleQueue') do |producer|
|
117
|
+
producer.send(session.message("Hello World"))
|
118
|
+
end
|
130
119
|
end
|
131
|
-
end
|
132
120
|
|
133
121
|
### Consumer
|
134
122
|
|
135
123
|
Consumers read message from a queue or topic
|
136
124
|
|
137
|
-
Example:
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
}
|
155
|
-
|
156
|
-
JMS::Connection.session(config) do |session|
|
157
|
-
session.consume(:q_name => 'ExampleQueue', :timeout=>1000) do |message|
|
158
|
-
p message
|
125
|
+
ActiveMQ Example:
|
126
|
+
require 'rubygems'
|
127
|
+
|
128
|
+
# Include JMS after ActiveMQ
|
129
|
+
require 'jms'
|
130
|
+
|
131
|
+
# Connect to ActiveMQ
|
132
|
+
config = {
|
133
|
+
:factory => 'org.apache.activemq.ActiveMQConnectionFactory',
|
134
|
+
:broker_url => 'tcp://localhost:61616',
|
135
|
+
:require_jars => ["~/Applications/apache-activemq-5.4.2/activemq-all-5.4.2.jar"]
|
136
|
+
}
|
137
|
+
|
138
|
+
JMS::Connection.session(config) do |session|
|
139
|
+
session.consume(:q_name => 'ExampleQueue', :timeout=>1000) do |message|
|
140
|
+
p message
|
141
|
+
end
|
159
142
|
end
|
160
|
-
end
|
161
143
|
|
162
144
|
Overview
|
163
145
|
--------
|
@@ -185,15 +167,16 @@ queue or topic match will be passed to the block.
|
|
185
167
|
Logging
|
186
168
|
-------
|
187
169
|
|
188
|
-
jruby-jms
|
189
|
-
|
170
|
+
jruby-jms detects the logging available in the current environment.
|
171
|
+
When running under Rails it will use the Rails logger, otherwise the standard
|
172
|
+
Ruby logger. The logger can also be replaced by calling Connection.logger=
|
190
173
|
|
191
174
|
Dependencies
|
192
175
|
------------
|
193
176
|
|
194
177
|
### JRuby
|
195
178
|
|
196
|
-
jruby-jms has been tested against JRuby 1.5.1, but should work with any
|
179
|
+
jruby-jms has been tested against JRuby 1.5.1 and 1.6, but should work with any
|
197
180
|
current JRuby version.
|
198
181
|
|
199
182
|
### JMS
|
@@ -221,7 +204,7 @@ Contributing
|
|
221
204
|
|
222
205
|
Once you've made your great commits:
|
223
206
|
|
224
|
-
1. [Fork][1]
|
207
|
+
1. [Fork][1] jruby-jms
|
225
208
|
2. Create a topic branch - `git checkout -b my_branch`
|
226
209
|
3. Push to your branch - `git push origin my_branch`
|
227
210
|
4. Create an [Issue][2] with a link to your branch
|
@@ -261,7 +244,7 @@ Reid Morrison :: rubywmq@gmail.com :: @reidmorrison
|
|
261
244
|
License
|
262
245
|
-------
|
263
246
|
|
264
|
-
Copyright 2008
|
247
|
+
Copyright 2008 - 2011 J. Reid Morrison
|
265
248
|
|
266
249
|
Licensed under the Apache License, Version 2.0 (the "License");
|
267
250
|
you may not use this file except in compliance with the License.
|
data/Rakefile
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
raise "jruby-jms must be built with JRuby: try again with `jruby -S rake'" unless defined?(JRUBY_VERSION)
|
2
2
|
|
3
3
|
require 'rake/clean'
|
4
|
+
require 'rake/testtask'
|
4
5
|
require 'date'
|
5
6
|
require 'java'
|
6
7
|
|
@@ -8,7 +9,7 @@ desc "Build gem"
|
|
8
9
|
task :gem do |t|
|
9
10
|
gemspec = Gem::Specification.new do |s|
|
10
11
|
s.name = 'jruby-jms'
|
11
|
-
s.version = '0.
|
12
|
+
s.version = '0.10.0'
|
12
13
|
s.author = 'Reid Morrison'
|
13
14
|
s.email = 'rubywmq@gmail.com'
|
14
15
|
s.homepage = 'https://github.com/reidmorrison/jruby-jms'
|
@@ -20,3 +21,13 @@ task :gem do |t|
|
|
20
21
|
end
|
21
22
|
Gem::Builder.new(gemspec).build
|
22
23
|
end
|
24
|
+
|
25
|
+
task :test do
|
26
|
+
|
27
|
+
Rake::TestTask.new(:functional) do |t|
|
28
|
+
t.test_files = FileList['test/*_test.rb']
|
29
|
+
t.verbose = true
|
30
|
+
end
|
31
|
+
|
32
|
+
Rake::Task['functional'].invoke
|
33
|
+
end
|
data/examples/jms.yml
CHANGED
@@ -9,7 +9,9 @@
|
|
9
9
|
activemq:
|
10
10
|
:factory: org.apache.activemq.ActiveMQConnectionFactory
|
11
11
|
:broker_url: tcp://localhost:61616
|
12
|
-
|
12
|
+
:require_jars:
|
13
|
+
- ~/Applications/apache-activemq-5.4.2/activemq-all-5.4.2.jar
|
14
|
+
|
13
15
|
hornetq:
|
14
16
|
# Connect to a local HornetQ Broker using JNDI
|
15
17
|
:jndi_name: /ConnectionFactory
|
@@ -19,4 +21,10 @@ hornetq:
|
|
19
21
|
java.naming.factory.url.pkgs: org.jboss.naming:org.jnp.interfaces
|
20
22
|
java.naming.security.principal: guest
|
21
23
|
java.naming.security.credentials: guest
|
22
|
-
|
24
|
+
:require_jars:
|
25
|
+
- ~/Applications/hornetq-2.1.2.Final/lib/hornetq-core-client.jar
|
26
|
+
- ~/Applications/hornetq-2.1.2.Final/lib/hornetq-core.jar
|
27
|
+
- ~/Applications/hornetq-2.1.2.Final/lib/hornetq-jms-client.jar
|
28
|
+
- ~/Applications/hornetq-2.1.2.Final/lib/jboss-jms-api.jar
|
29
|
+
- ~/Applications/hornetq-2.1.2.Final/lib/jnp-client.jar
|
30
|
+
- ~/Applications/hornetq-2.1.2.Final/lib/netty.jar
|
data/lib/jms.rb
CHANGED
@@ -15,11 +15,5 @@
|
|
15
15
|
################################################################################
|
16
16
|
|
17
17
|
require 'java'
|
18
|
+
require 'jms/logging'
|
18
19
|
require 'jms/connection'
|
19
|
-
require 'jms/javax_jms_message'
|
20
|
-
require 'jms/javax_jms_text_message'
|
21
|
-
require 'jms/javax_jms_map_message'
|
22
|
-
require 'jms/javax_jms_object_message'
|
23
|
-
require 'jms/javax_jms_session'
|
24
|
-
require 'jms/javax_jms_message_consumer'
|
25
|
-
require 'jms/javax_jms_queue_browser'
|
data/lib/jms/connection.rb
CHANGED
@@ -52,13 +52,12 @@ module JMS
|
|
52
52
|
# The above code creates a Connection and then a Session. Once the block completes
|
53
53
|
# the session is closed and the Connection disconnected.
|
54
54
|
#
|
55
|
-
#
|
55
|
+
# See: http://download.oracle.com/javaee/6/api/javax/jms/Connection.html
|
56
56
|
#
|
57
|
-
|
58
57
|
class Connection
|
59
58
|
# Create a connection to the JMS provider, start the connection,
|
60
59
|
# call the supplied code block, then close the connection upon completion
|
61
|
-
#
|
60
|
+
#
|
62
61
|
# Returns the result of the supplied block
|
63
62
|
def self.start(parms = {}, &proc)
|
64
63
|
raise "Missing mandatory Block when calling JMS::Connection.start" unless proc
|
@@ -70,35 +69,57 @@ module JMS
|
|
70
69
|
connection.close
|
71
70
|
end
|
72
71
|
end
|
73
|
-
|
72
|
+
|
74
73
|
# Connect to a JMS Broker, create a session and call the code block passing in the session
|
75
74
|
# Both the Session and Connection are closed on termination of the block
|
76
|
-
#
|
75
|
+
#
|
77
76
|
# Shortcut convenience method to both connect to the broker and create a session
|
78
77
|
# Useful when only a single session is required in the current thread
|
79
|
-
#
|
78
|
+
#
|
80
79
|
# Note: It is important that each thread have its own session to support transactions
|
81
80
|
def self.session(parms = {}, &proc)
|
82
81
|
self.start(parms) do |connection|
|
83
82
|
connection.session(parms, &proc)
|
84
83
|
end
|
85
84
|
end
|
86
|
-
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
90
|
-
#
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
#
|
96
|
-
|
97
|
-
|
85
|
+
|
86
|
+
# Load the required jar files for this JMS Provider and
|
87
|
+
# load JRuby extensions for those classes
|
88
|
+
#
|
89
|
+
# Rather than copying the JMS jar files into the JRuby lib, load them
|
90
|
+
# on demand. JRuby JMS extensions are only loaded once the jar files have been
|
91
|
+
# loaded.
|
92
|
+
#
|
93
|
+
# Can be called multiple times if required, although it would not be performant
|
94
|
+
# to do so regularly.
|
95
|
+
#
|
96
|
+
# Parameter: jar_list is an Array of the path and filenames to jar files
|
97
|
+
# to load for this JMS Provider
|
98
|
+
#
|
99
|
+
# Returns nil
|
100
|
+
#
|
101
|
+
# TODO make this a class method
|
102
|
+
def fetch_dependencies(jar_list)
|
103
|
+
jar_list.each do |jar|
|
104
|
+
JMS::logger.info "Loading Jar File:#{jar}"
|
105
|
+
begin
|
106
|
+
require jar
|
107
|
+
rescue Exception => exc
|
108
|
+
JMS::logger.error "Failed to Load Jar File:#{jar}. #{exc.to_s}"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
require 'jms/message_listener'
|
112
|
+
require 'jms/javax_jms_message'
|
113
|
+
require 'jms/javax_jms_text_message'
|
114
|
+
require 'jms/javax_jms_map_message'
|
115
|
+
require 'jms/javax_jms_object_message'
|
116
|
+
require 'jms/javax_jms_session'
|
117
|
+
require 'jms/javax_jms_message_consumer'
|
118
|
+
require 'jms/javax_jms_queue_browser'
|
98
119
|
end
|
99
120
|
|
100
121
|
# Create a connection to the JMS provider
|
101
|
-
#
|
122
|
+
#
|
102
123
|
# Note: Connection::start must be called before any consumers will be
|
103
124
|
# able to receive messages
|
104
125
|
#
|
@@ -166,7 +187,7 @@ module JMS
|
|
166
187
|
# For: Active MQ
|
167
188
|
# :factory => 'org.apache.activemq.ActiveMQConnectionFactory',
|
168
189
|
# :broker_url => 'tcp://localhost:61616'
|
169
|
-
#
|
190
|
+
#
|
170
191
|
# ActiveMQ requires the following jar files on your CLASSPATH
|
171
192
|
#
|
172
193
|
# For Oracle AQ 9 Server
|
@@ -200,6 +221,10 @@ module JMS
|
|
200
221
|
@sessions = []
|
201
222
|
@consumers = []
|
202
223
|
|
224
|
+
# Load Jar files on demand so that they do not need to be in the CLASSPATH
|
225
|
+
# of JRuby lib directory
|
226
|
+
fetch_dependencies(params[:require_jars]) if params[:require_jars]
|
227
|
+
|
203
228
|
connection_factory = nil
|
204
229
|
factory = params[:factory]
|
205
230
|
if factory
|
@@ -218,12 +243,12 @@ module JMS
|
|
218
243
|
raise "Missing mandatory parameter :factory or :jndi_name missing in call to Connection::connect"
|
219
244
|
end
|
220
245
|
|
221
|
-
|
246
|
+
JMS::logger.debug "Using Factory: #{connection_factory.java_class}" if connection_factory.respond_to? :java_class
|
222
247
|
params.each_pair do |key, val|
|
223
248
|
method = key.to_s+'='
|
224
249
|
if connection_factory.respond_to? method
|
225
250
|
connection_factory.send method, val
|
226
|
-
|
251
|
+
JMS::logger.debug " #{key} = #{connection_factory.send key}" if connection_factory.respond_to? key.to_sym
|
227
252
|
end
|
228
253
|
end
|
229
254
|
if params[:username]
|
@@ -233,18 +258,18 @@ module JMS
|
|
233
258
|
end
|
234
259
|
end
|
235
260
|
|
236
|
-
# Start delivery of messages over this connection.
|
261
|
+
# Start (or restart) delivery of incoming messages over this connection.
|
237
262
|
# By default no messages are delivered until this method is called explicitly
|
238
263
|
# Delivery of messages to any asynchronous Destination::each() call will only
|
239
|
-
# start after Connection::start is called
|
240
|
-
# Corresponds to JMS start call
|
264
|
+
# start after Connection::start is called, or Connection.start is used
|
241
265
|
def start
|
242
266
|
@jms_connection.start
|
243
267
|
end
|
244
|
-
|
245
|
-
#
|
268
|
+
|
269
|
+
# Temporarily stop delivery of incoming messages on this connection
|
246
270
|
# Useful during a hot code update or other changes that need to be completed
|
247
271
|
# without any new messages being processed
|
272
|
+
# Call start() to resume receiving messages
|
248
273
|
def stop
|
249
274
|
@jms_connection.stop
|
250
275
|
end
|
@@ -274,7 +299,7 @@ module JMS
|
|
274
299
|
|
275
300
|
# Create a session over this connection.
|
276
301
|
# It is recommended to create separate sessions for each thread
|
277
|
-
#
|
302
|
+
#
|
278
303
|
# Note: Remember to call close on the returned session when it is no longer
|
279
304
|
# needed. Rather use JMS::Connection#session with a block whenever
|
280
305
|
# possible
|
@@ -284,10 +309,26 @@ module JMS
|
|
284
309
|
# Determines whether transactions are supported within this session.
|
285
310
|
# I.e. Whether commit or rollback can be called
|
286
311
|
# Default: false
|
287
|
-
#
|
288
|
-
#
|
312
|
+
# Note: :options below is ignored if this value is set to :true
|
313
|
+
# :options => any of the javax.jms.Session constants:
|
314
|
+
# Note: :options is ignored of :transacted => true
|
315
|
+
# javax.jms.Session::AUTO_ACKNOWLEDGE
|
316
|
+
# With this acknowledgment mode, the session automatically acknowledges
|
317
|
+
# a client's receipt of a message either when the session has successfully
|
318
|
+
# returned from a call to receive or when the message listener the session has
|
319
|
+
# called to process the message successfully returns.
|
320
|
+
# javax.jms.Session::CLIENT_ACKNOWLEDGE
|
321
|
+
# With this acknowledgment mode, the client acknowledges a consumed
|
322
|
+
# message by calling the message's acknowledge method.
|
323
|
+
# javax.jms.Session::DUPS_OK_ACKNOWLEDGE
|
324
|
+
# This acknowledgment mode instructs the session to lazily acknowledge
|
325
|
+
# the delivery of messages.
|
326
|
+
# javax.jms.Session::SESSION_TRANSACTED
|
327
|
+
# This value is returned from the method getAcknowledgeMode if the
|
328
|
+
# session is transacted.
|
329
|
+
# Default: javax.jms.Session::AUTO_ACKNOWLEDGE
|
289
330
|
#
|
290
|
-
def create_session(parms={}
|
331
|
+
def create_session(parms={})
|
291
332
|
transacted = parms[:transacted] || false
|
292
333
|
options = parms[:options] || javax.jms.Session::AUTO_ACKNOWLEDGE
|
293
334
|
@jms_connection.create_session(transacted, options)
|
@@ -304,13 +345,61 @@ module JMS
|
|
304
345
|
|
305
346
|
@jms_connection.close if @jms_connection
|
306
347
|
end
|
348
|
+
|
349
|
+
# Gets the client identifier for this connection.
|
350
|
+
def client_id
|
351
|
+
@jms_connection.getClientID
|
352
|
+
end
|
353
|
+
|
354
|
+
# Sets the client identifier for this connection.
|
355
|
+
def client_id=(client_id)
|
356
|
+
@jms_connection.setClientID(client_id)
|
357
|
+
end
|
358
|
+
|
359
|
+
# Returns the ExceptionListener object for this connection
|
360
|
+
# Returned class implements interface javax.jms.ExceptionListener
|
361
|
+
def exception_listener
|
362
|
+
@jms_connection.getExceptionListener
|
363
|
+
end
|
364
|
+
|
365
|
+
# Sets an exception listener for this connection
|
366
|
+
# See ::on_exception to set a Ruby Listener
|
367
|
+
# Returns: nil
|
368
|
+
def exception_listener=(listener)
|
369
|
+
setExceptionListener(listener)
|
370
|
+
end
|
371
|
+
|
372
|
+
# Whenever an exception occurs the supplied block is called
|
373
|
+
# This is important when Connection::on_message has been used, since
|
374
|
+
# failures to the connection would be lost otherwise
|
375
|
+
#
|
376
|
+
# For details on the supplied parameter when the block is called,
|
377
|
+
# see: http://download.oracle.com/javaee/6/api/javax/jms/JMSException.html
|
378
|
+
#
|
379
|
+
# Example:
|
380
|
+
# connection.on_message do |jms_exception|
|
381
|
+
# puts "JMS Exception has occurred: #{jms_exception}"
|
382
|
+
# end
|
383
|
+
#
|
384
|
+
# Returns: nil
|
385
|
+
def on_exception(&block)
|
386
|
+
setExceptionListener(block)
|
387
|
+
end
|
388
|
+
|
389
|
+
# Gets the metadata for this connection
|
390
|
+
# see: http://download.oracle.com/javaee/6/api/javax/jms/ConnectionMetaData.html
|
391
|
+
def meta_data
|
392
|
+
@jms_connection.getMetaData
|
393
|
+
end
|
394
|
+
|
395
|
+
# Return a string describing the JMS provider and version
|
396
|
+
def to_s
|
397
|
+
md = @jms_connection.getMetaData
|
398
|
+
"JMS::Connection provider: #{md.getJMSProviderName} v#{md.getProviderVersion}, JMS v#{md.getJMSVersion}"
|
399
|
+
end
|
307
400
|
|
308
401
|
# TODO: Return a pretty print version of the current JMS Connection
|
309
402
|
# def to_s
|
310
|
-
# "Connected to " + metaData.getJMSProviderName() +
|
311
|
-
# " version " + metaData.getProviderVersion() + " (" +
|
312
|
-
# metaData.getProviderMajorVersion() + "." + metaData.getProviderMinorVersion() +
|
313
|
-
# ")";
|
314
403
|
# end
|
315
404
|
|
316
405
|
# Receive messages in a separate thread when they arrive
|
@@ -351,7 +440,7 @@ module JMS
|
|
351
440
|
# :no_local => Determine whether messages published by its own connection
|
352
441
|
# should be delivered to it
|
353
442
|
# Default: false
|
354
|
-
#
|
443
|
+
#
|
355
444
|
# :statistics Capture statistics on how many messages have been read
|
356
445
|
# true : This method will capture statistics on the number of messages received
|
357
446
|
# and the time it took to process them.
|
@@ -369,6 +458,9 @@ module JMS
|
|
369
458
|
# false => The session is rolled back
|
370
459
|
# Any Exception => The session is rolled back
|
371
460
|
#
|
461
|
+
# Note: Also supply connection::on_exception so that connection failures can be handled
|
462
|
+
#
|
463
|
+
#
|
372
464
|
def on_message(parms, &proc)
|
373
465
|
raise "JMS::Connection must be connected prior to calling JMS::Connection::on_message" unless @sessions && @consumers
|
374
466
|
|
@@ -399,68 +491,6 @@ module JMS
|
|
399
491
|
|
400
492
|
end
|
401
493
|
|
402
|
-
# For internal use only
|
403
|
-
private
|
404
|
-
class MessageListener
|
405
|
-
include javax.jms::MessageListener
|
406
|
-
|
407
|
-
# Parameters:
|
408
|
-
# :statistics Capture statistics on how many messages have been read
|
409
|
-
# true : This method will capture statistics on the number of messages received
|
410
|
-
# and the time it took to process them.
|
411
|
-
# The timer starts when the listener instance is created and finishes when either the last message was received,
|
412
|
-
# or when Destination::statistics is called. In this case MessageConsumer::statistics
|
413
|
-
# can be called several times during processing without affecting the end time.
|
414
|
-
# Also, the start time and message count is not reset until MessageConsumer::each
|
415
|
-
# is called again with :statistics => true
|
416
|
-
#
|
417
|
-
# The statistics gathered are returned when :statistics => true and :async => false
|
418
|
-
def initialize(parms={}, &proc)
|
419
|
-
@proc = proc
|
420
|
-
@log = org.apache.commons.logging.LogFactory.getLog('JMS.MessageListener')
|
421
|
-
|
422
|
-
if parms[:statistics]
|
423
|
-
@message_count = 0
|
424
|
-
@start_time = Time.now
|
425
|
-
end
|
426
|
-
end
|
427
|
-
|
428
|
-
# Method called for every message received on the queue
|
429
|
-
# Per the JMS specification, this method will be called sequentially for each message on the queue.
|
430
|
-
# This method will not be called again until its prior invocation has completed.
|
431
|
-
# Must be onMessage() since on_message() does not work for interface methods that must be implemented
|
432
|
-
def onMessage(message)
|
433
|
-
begin
|
434
|
-
if @message_count
|
435
|
-
@message_count += 1
|
436
|
-
@last_time = Time.now
|
437
|
-
end
|
438
|
-
@proc.call message
|
439
|
-
rescue SyntaxError, NameError => boom
|
440
|
-
@log.error "Unhandled Exception processing JMS Message. Doesn't compile: " + boom
|
441
|
-
@log.error "Ignoring poison message:\n#{message.inspect}"
|
442
|
-
@log.error boom.backtrace.join("\n")
|
443
|
-
rescue StandardError => bang
|
444
|
-
@log.error "Unhandled Exception processing JMS Message. Doesn't compile: " + bang
|
445
|
-
@log.error "Ignoring poison message:\n#{message.inspect}"
|
446
|
-
@log.error boom.backtrace.join("\n")
|
447
|
-
rescue => exc
|
448
|
-
@log.error "Unhandled Exception processing JMS Message. Exception occurred:\n#{exc}"
|
449
|
-
@log.error "Ignoring poison message:\n#{message.inspect}"
|
450
|
-
@log.error exc.backtrace.join("\n")
|
451
|
-
end
|
452
|
-
end
|
453
|
-
|
454
|
-
# Return Statistics gathered for this listener
|
455
|
-
def statistics
|
456
|
-
raise "First call MessageConsumer::on_message with :statistics=>true before calling MessageConsumer::statistics()" unless @message_count
|
457
|
-
duration =(@last_time || Time.now) - @start_time
|
458
|
-
{:messages => @message_count,
|
459
|
-
:duration => duration,
|
460
|
-
:messages_per_second => (@message_count/duration).to_i}
|
461
|
-
end
|
462
|
-
end
|
463
|
-
|
464
494
|
# Wrapper to support Oracle AQ
|
465
495
|
class OracleAQConnectionFactory
|
466
496
|
attr_accessor :username, :url
|