jruby-jms 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|