jruby-jms 1.1.0-java → 1.2.0-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.
- checksums.yaml +4 -4
- data/HISTORY.md +24 -7
- data/README.md +49 -49
- data/Rakefile +17 -12
- data/lib/jms.rb +8 -17
- data/lib/jms/bytes_message.rb +3 -19
- data/lib/jms/connection.rb +63 -83
- data/lib/jms/map_message.rb +9 -25
- data/lib/jms/message.rb +22 -173
- data/lib/jms/message_consumer.rb +23 -35
- data/lib/jms/message_listener_impl.rb +22 -38
- data/lib/jms/message_producer.rb +9 -25
- data/lib/jms/mq_workaround.rb +11 -26
- data/lib/jms/object_message.rb +1 -17
- data/lib/jms/oracle_a_q_connection_factory.rb +4 -21
- data/lib/jms/queue_browser.rb +2 -18
- data/lib/jms/session.rb +92 -106
- data/lib/jms/session_pool.rb +34 -41
- data/lib/jms/text_message.rb +0 -16
- data/lib/jms/version.rb +1 -1
- data/test/connection_test.rb +35 -81
- data/test/jms.yml +18 -8
- data/test/message_test.rb +27 -43
- data/test/session_pool_test.rb +30 -46
- data/test/session_test.rb +30 -45
- data/test/test_helper.rb +33 -0
- metadata +20 -26
- data/Gemfile +0 -8
- data/Gemfile.lock +0 -36
- data/examples/advanced/session_pool.rb +0 -37
- data/examples/client-server/replier.rb +0 -29
- data/examples/client-server/requestor.rb +0 -40
- data/examples/file-to-q/files_to_q.rb +0 -51
- data/examples/file-to-q/q_to_files.rb +0 -44
- data/examples/invm/invm.rb +0 -44
- data/examples/invm/log4j.properties +0 -58
- data/examples/jms.yml +0 -149
- data/examples/performance/consumer.rb +0 -25
- data/examples/performance/producer.rb +0 -31
- data/examples/producer-consumer/browser.rb +0 -24
- data/examples/producer-consumer/consumer.rb +0 -24
- data/examples/producer-consumer/consumer_async.rb +0 -41
- data/examples/producer-consumer/producer.rb +0 -25
- data/examples/publish-subscribe/publish.rb +0 -24
- data/examples/publish-subscribe/subscribe.rb +0 -31
- data/lib/jms/logging.rb +0 -50
- data/nbproject/private/private.properties +0 -3
- data/nbproject/private/rake-d.txt +0 -5
- data/parallel_minion.gemspec +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c58dfbbab766a5b4ad1f7f383e256294e658089f
|
4
|
+
data.tar.gz: 7ec282e9a6f7b9ab24fa9502be32c7a16f66a2ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7099c5bc513f3616e5a01073671a2e40cc33b7a697e6807cf7c4ada87d76ae61a8c0056397e5bc72bfb6aeeac5df58f448c2c9946d20fc64580884b7b6db2c77
|
7
|
+
data.tar.gz: bda4d42a7fa8f4f299e9120042caf7e707117fe755628edd7ad167ec4ba65a9a0c1f053be5ff4de54b8a2f3f99a8b7e4ad8dceacb6f47ea1aa11c692c3abe636
|
data/HISTORY.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## 1.2.0 (2015-08-29)
|
2
|
+
|
3
|
+
* Tested against JRuby 9.0.0.0
|
4
|
+
* Drop support for JRuby 1.5 and 1.6
|
5
|
+
* Tested against ActiveMQ 5.11, and HornetQ 2.4
|
6
|
+
* Raises ArgumentError instead of RuntimeError for missing arguments
|
7
|
+
* Update tests
|
8
|
+
* Upgrade to Minitest 5.8
|
9
|
+
* Switch to Ruby 1.9 hash syntax
|
10
|
+
* Reformat code
|
11
|
+
|
12
|
+
## 1.1.0 (2014-04-10)
|
13
|
+
|
14
|
+
* Support Oracle AQ 11gR2
|
15
|
+
* Tibco EMS Examples
|
16
|
+
* Add .gemspec file
|
17
|
+
|
1
18
|
## 1.0.0 (2012-10-21)
|
2
19
|
|
3
20
|
* Issue #10 Support WebSphereMQ V7
|
@@ -18,16 +35,16 @@
|
|
18
35
|
|
19
36
|
* Compatibility with JRuby 1.6
|
20
37
|
* I hate doing this, but unfortunately there is a small breaking change in this release:
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
38
|
+
* We can no longer pass symbols into the following methods:
|
39
|
+
* jms_delivery_mode
|
40
|
+
* jms_delivery_mode=
|
41
|
+
* Just rename existing uses of the above methods to:
|
42
|
+
* jms_delivery_mode_sym
|
43
|
+
* jms_delivery_mode_sym=
|
27
44
|
* Added Session Pool - requires GenePool as a dependency if used
|
28
45
|
* Generate warning log entry for any parameters not known to the ConnectionFactory
|
29
46
|
* Use java_import for all javax.jms classes
|
30
|
-
|
47
|
+
* Rename all Java source files to match new names
|
31
48
|
|
32
49
|
## 0.10.1 (2011-02-21)
|
33
50
|
|
data/README.md
CHANGED
@@ -2,14 +2,18 @@
|
|
2
2
|
|
3
3
|
* http://github.com/reidmorrison/jruby-jms
|
4
4
|
|
5
|
-
|
5
|
+
jruby-jms is a complete JRuby API into Java Messaging Specification (JMS) V1.1.
|
6
|
+
|
7
|
+
Note: jruby-jms is for JRuby only.
|
8
|
+
|
9
|
+
### Design
|
6
10
|
|
7
11
|
jruby-jms attempts to "rubify" the Java JMS API without
|
8
12
|
compromising performance. It does this by sprinkling "Ruby-goodness" into the
|
9
13
|
existing JMS Java interfaces, I.e. By adding Ruby methods to the existing
|
10
14
|
classes and interfaces. Since jruby-jms exposes the JMS
|
11
15
|
Java classes directly there is no performance impact that would have been
|
12
|
-
introduced had the entire API been wrapped
|
16
|
+
introduced had the entire API been wrapped with an extra Ruby layer.
|
13
17
|
|
14
18
|
In this way, using regular Ruby constructs a Ruby program can easily
|
15
19
|
interact with JMS in a highly performant way. Also, in this way you are not
|
@@ -18,7 +22,23 @@ API is available to you at any time.
|
|
18
22
|
|
19
23
|
### Install
|
20
24
|
|
21
|
-
|
25
|
+
Add to Gemfile if using bundler:
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
gem 'jruby-jms'
|
29
|
+
```
|
30
|
+
|
31
|
+
Install using bundler:
|
32
|
+
|
33
|
+
bundle
|
34
|
+
|
35
|
+
If not using Bundler:
|
36
|
+
|
37
|
+
gem install jruby-jms
|
38
|
+
|
39
|
+
### Documentation
|
40
|
+
|
41
|
+
* [API Reference](http://www.rubydoc.info/gems/jruby-jms)
|
22
42
|
|
23
43
|
### Simplification
|
24
44
|
|
@@ -56,7 +76,7 @@ for passing messages between threads in the same JVM.
|
|
56
76
|
|
57
77
|
In order to connect to any broker the Client JMS application must create a
|
58
78
|
connection. In traditional JMS a ConnectionFactory is used to create connections.
|
59
|
-
In jruby-jms the JMS::Connection takes care of the complexities of dealing with
|
79
|
+
In jruby-jms the `JMS::Connection` takes care of the complexities of dealing with
|
60
80
|
the factory class, just pass the required parameters to Connection.new and
|
61
81
|
jruby-jms takes care of the rest.
|
62
82
|
|
@@ -79,23 +99,21 @@ Producers write messages to queues or topics
|
|
79
99
|
ActiveMQ Example:
|
80
100
|
|
81
101
|
```ruby
|
82
|
-
require 'rubygems'
|
83
102
|
require 'jms'
|
84
103
|
|
85
104
|
# Connect to ActiveMQ
|
86
105
|
config = {
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
]
|
106
|
+
:factory: org.apache.activemq.ActiveMQConnectionFactory
|
107
|
+
:broker_url: tcp://localhost:61616
|
108
|
+
:require_jars:
|
109
|
+
- /usr/local/Cellar/activemq/5.11.1/libexec/activemq-all-5.11.1.jar
|
110
|
+
- /usr/local/Cellar/activemq/5.11.1/libexec/lib/optional/log4j-1.2.17.jar
|
93
111
|
}
|
94
112
|
|
95
113
|
JMS::Connection.session(config) do |session|
|
96
|
-
|
114
|
+
session.producer(queue_name: 'ExampleQueue') do |producer|
|
97
115
|
producer.send(session.message("Hello World"))
|
98
|
-
|
116
|
+
end
|
99
117
|
end
|
100
118
|
```
|
101
119
|
|
@@ -111,34 +129,32 @@ require 'jms'
|
|
111
129
|
|
112
130
|
# Connect to ActiveMQ
|
113
131
|
config = {
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
]
|
132
|
+
:factory: org.apache.activemq.ActiveMQConnectionFactory
|
133
|
+
:broker_url: tcp://localhost:61616
|
134
|
+
:require_jars:
|
135
|
+
- /usr/local/Cellar/activemq/5.11.1/libexec/activemq-all-5.11.1.jar
|
136
|
+
- /usr/local/Cellar/activemq/5.11.1/libexec/lib/optional/log4j-1.2.17.jar
|
120
137
|
}
|
121
138
|
|
122
139
|
JMS::Connection.session(config) do |session|
|
123
|
-
|
140
|
+
session.consume(queue_name: 'ExampleQueue', timeout: 1000) do |message|
|
124
141
|
p message
|
125
|
-
|
142
|
+
end
|
126
143
|
end
|
127
144
|
```
|
128
145
|
|
129
|
-
##
|
146
|
+
## More Examples
|
130
147
|
|
131
|
-
|
132
|
-
followed by several JMS Providers.
|
148
|
+
There are several more examples available at https://github.com/reidmorrison/jruby-jms/tree/master/examples
|
133
149
|
|
134
150
|
## Threading
|
135
151
|
|
136
|
-
A JMS::Connection instance can be shared between threads, whereas a session,
|
152
|
+
A `JMS::Connection` instance can be shared between threads, whereas a session,
|
137
153
|
consumer, producer, and any artifacts created by the session should only be
|
138
154
|
used by one thread at a time.
|
139
155
|
|
140
156
|
For consumers, it is recommended to create a session for each thread and leave
|
141
|
-
that thread blocked on Consumer
|
157
|
+
that thread blocked on `Consumer#receive`. Or, even better use `Connection#on_message`
|
142
158
|
which will create a session, within which any message received from the specified
|
143
159
|
queue or topic will be passed to the block.
|
144
160
|
|
@@ -146,7 +162,7 @@ queue or topic will be passed to the block.
|
|
146
162
|
|
147
163
|
jruby-jms detects the logging available in the current environment.
|
148
164
|
When running under Rails it will use the Rails logger, otherwise it will use the
|
149
|
-
standard Ruby logger. The logger can also be replaced by calling
|
165
|
+
standard Ruby logger. The logger can also be replaced by calling `JMS.logger=`
|
150
166
|
|
151
167
|
## Dependencies
|
152
168
|
|
@@ -154,35 +170,19 @@ standard Ruby logger. The logger can also be replaced by calling Connection.logg
|
|
154
170
|
|
155
171
|
In order to communicate with a JMS V 1.1 provider jruby-jms needs the jar files supplied
|
156
172
|
by the JMS provider. As in the examples above the jar files can be specified in
|
157
|
-
the configuration element
|
173
|
+
the configuration element `:require_jars`. Otherwise, the jars must be explicitly
|
158
174
|
required in the Ruby code:
|
159
175
|
|
160
176
|
```ruby
|
161
|
-
require
|
177
|
+
require '/usr/local/Cellar/activemq/5.11.1/libexec/activemq-all-5.11.1.jar'
|
178
|
+
require '/usr/local/Cellar/activemq/5.11.1/libexec/lib/optional/log4j-1.2.17.jar'
|
162
179
|
```
|
163
180
|
|
164
181
|
### JRuby
|
165
182
|
|
166
|
-
jruby-jms has been tested against JRuby 1.
|
167
|
-
|
168
|
-
## Contributing
|
169
|
-
|
170
|
-
Once you've made your great commits:
|
171
|
-
|
172
|
-
1. [Fork](http://help.github.com/forking/) jruby-jms
|
173
|
-
2. Create a topic branch - `git checkout -b my_branch`
|
174
|
-
3. Push to your branch - `git push origin my_branch`
|
175
|
-
4. Create an [Issue](http://github.com/reidmorrison/jruby-jms/issues) with a link to your branch
|
176
|
-
5. That's it!
|
177
|
-
|
178
|
-
## Meta
|
179
|
-
|
180
|
-
* Code: `git clone git://github.com/reidmorrison/jruby-jms.git`
|
181
|
-
* Home: <http://github.com/reidmorrison/jruby-jms>
|
182
|
-
* Bugs: <http://github.com/reidmorrison/jruby-jms/issues>
|
183
|
-
* Gems: <http://rubygems.org/gems/jruby-jms>
|
183
|
+
jruby-jms has been tested against JRuby 1.7, and JRuby 9.0.0.0
|
184
184
|
|
185
|
-
|
185
|
+
## Versioning
|
186
186
|
|
187
187
|
## Author
|
188
188
|
|
@@ -190,7 +190,7 @@ Reid Morrison :: reidmo@gmail.com :: @reidmorrison
|
|
190
190
|
|
191
191
|
## License
|
192
192
|
|
193
|
-
Copyright 2008 -
|
193
|
+
Copyright 2008 - 2015 J. Reid Morrison
|
194
194
|
|
195
195
|
Licensed under the Apache License, Version 2.0 (the "License");
|
196
196
|
you may not use this file except in compliance with the License.
|
data/Rakefile
CHANGED
@@ -1,20 +1,23 @@
|
|
1
|
-
lib = File.expand_path('../lib/', __FILE__)
|
2
|
-
$:.unshift lib unless $:.include?(lib)
|
3
|
-
|
4
|
-
raise "jruby-jms must be built with JRuby: try again with `jruby -S rake'" unless defined?(JRUBY_VERSION)
|
5
|
-
|
6
|
-
require 'rubygems'
|
7
|
-
require 'rubygems/package'
|
8
1
|
require 'rake/clean'
|
9
2
|
require 'rake/testtask'
|
3
|
+
|
4
|
+
raise 'jruby-jms must be built with JRuby' unless defined?(JRUBY_VERSION)
|
5
|
+
|
6
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
10
7
|
require 'jms/version'
|
11
8
|
|
12
|
-
|
13
|
-
|
14
|
-
Gem::Package.build(Gem::Specification.load('parallel_minion.gemspec'))
|
9
|
+
task :gem do
|
10
|
+
system 'gem build jruby-jms.gemspec'
|
15
11
|
end
|
16
12
|
|
17
|
-
|
13
|
+
task :publish => :gem do
|
14
|
+
system "git tag -a v#{JMS::VERSION} -m 'Tagging #{JMS::VERSION}'"
|
15
|
+
system 'git push --tags'
|
16
|
+
system "gem push jruby-jms-#{JMS::VERSION}-java.gem"
|
17
|
+
system "rm jruby-jms-#{JMS::VERSION}-java.gem"
|
18
|
+
end
|
19
|
+
|
20
|
+
desc 'Run Test Suite'
|
18
21
|
task :test do
|
19
22
|
Rake::TestTask.new(:functional) do |t|
|
20
23
|
t.test_files = FileList['test/*_test.rb']
|
@@ -24,7 +27,9 @@ task :test do
|
|
24
27
|
Rake::Task['functional'].invoke
|
25
28
|
end
|
26
29
|
|
27
|
-
|
30
|
+
task :default => :test
|
31
|
+
|
32
|
+
desc 'Generate RDOC documentation'
|
28
33
|
task :doc do
|
29
34
|
system "rdoc --main README.md --inline-source --quiet README.md `find lib -name '*.rb'`"
|
30
35
|
end
|
data/lib/jms.rb
CHANGED
@@ -1,20 +1,11 @@
|
|
1
|
-
################################################################################
|
2
|
-
# Copyright 2008, 2009, 2010, 2011 J. Reid Morrison
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
# See the License for the specific language governing permissions and
|
14
|
-
# limitations under the License.
|
15
|
-
################################################################################
|
16
|
-
|
17
1
|
require 'java'
|
18
2
|
require 'jms/version'
|
19
|
-
require 'jms/logging'
|
20
3
|
require 'jms/connection'
|
4
|
+
require 'semantic_logger'
|
5
|
+
|
6
|
+
module JMS
|
7
|
+
# Add Logging capabilities
|
8
|
+
include SemanticLogger::Loggable
|
9
|
+
|
10
|
+
autoload :SessionPool, 'jms/session_pool'
|
11
|
+
end
|
data/lib/jms/bytes_message.rb
CHANGED
@@ -1,20 +1,4 @@
|
|
1
|
-
|
2
|
-
# Copyright 2008, 2009, 2010, 2011 J. Reid Morrison
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
# See the License for the specific language governing permissions and
|
14
|
-
# limitations under the License.
|
15
|
-
################################################################################
|
16
|
-
|
17
|
-
#Interface javax.jms.BytesMessage
|
1
|
+
# Interface javax.jms.BytesMessage
|
18
2
|
module JMS::BytesMessage
|
19
3
|
def data
|
20
4
|
# Puts the message body in read-only mode and repositions the stream of
|
@@ -25,9 +9,9 @@ module JMS::BytesMessage
|
|
25
9
|
|
26
10
|
return nil if available == 0
|
27
11
|
|
28
|
-
result
|
12
|
+
result = ''
|
29
13
|
bytes_size = 1024
|
30
|
-
bytes
|
14
|
+
bytes = Java::byte[bytes_size].new
|
31
15
|
|
32
16
|
while (n = available < bytes_size ? available : bytes_size) > 0
|
33
17
|
self.read_bytes(bytes, n)
|
data/lib/jms/connection.rb
CHANGED
@@ -1,19 +1,4 @@
|
|
1
|
-
|
2
|
-
# Copyright 2008, 2009, 2010, 2011 J. Reid Morrison
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
# See the License for the specific language governing permissions and
|
14
|
-
# limitations under the License.
|
15
|
-
################################################################################
|
16
|
-
|
1
|
+
require 'semantic_logger'
|
17
2
|
# Module: Java Messaging System (JMS) Interface
|
18
3
|
module JMS
|
19
4
|
# Every JMS session must have at least one Connection instance
|
@@ -32,12 +17,11 @@ module JMS
|
|
32
17
|
# require 'jms'
|
33
18
|
#
|
34
19
|
# JMS::Connection.create_session(
|
35
|
-
# :
|
36
|
-
# :
|
37
|
-
# :
|
38
|
-
# '
|
39
|
-
# '
|
40
|
-
# '~/Applications/apache-activemq-5.5.0/lib/optional/log4j-1.2.14.jar',
|
20
|
+
# factory: 'org.apache.activemq.ActiveMQConnectionFactory',
|
21
|
+
# broker_url: 'tcp://localhost:61616',
|
22
|
+
# require_jars: [
|
23
|
+
# '/usr/local/Cellar/activemq/5.11.1/libexec/activemq-all-5.11.1.jar',
|
24
|
+
# '/usr/local/Cellar/activemq/5.11.1/libexec/lib/optional/log4j-1.2.17.jar'
|
41
25
|
# ]
|
42
26
|
# ) do |session|
|
43
27
|
# session.consumer(:queue_name=>'TEST') do |consumer|
|
@@ -55,16 +39,18 @@ module JMS
|
|
55
39
|
# See: http://download.oracle.com/javaee/6/api/javax/jms/Connection.html
|
56
40
|
#
|
57
41
|
class Connection
|
42
|
+
include SemanticLogger::Loggable
|
43
|
+
|
58
44
|
# Create a connection to the JMS provider, start the connection,
|
59
45
|
# call the supplied code block, then close the connection upon completion
|
60
46
|
#
|
61
47
|
# Returns the result of the supplied block
|
62
|
-
def self.start(params = {}, &
|
63
|
-
raise
|
48
|
+
def self.start(params = {}, &block)
|
49
|
+
raise(ArgumentError, 'Missing mandatory Block when calling JMS::Connection.start') unless block
|
64
50
|
connection = Connection.new(params)
|
65
51
|
connection.start
|
66
52
|
begin
|
67
|
-
|
53
|
+
block.call(connection)
|
68
54
|
ensure
|
69
55
|
connection.close
|
70
56
|
end
|
@@ -80,9 +66,9 @@ module JMS
|
|
80
66
|
# Note: It is important that each thread have its own session to support transactions
|
81
67
|
# This method will also start the session immediately so that any
|
82
68
|
# consumers using this session will start immediately
|
83
|
-
def self.session(params = {}, &
|
69
|
+
def self.session(params = {}, &block)
|
84
70
|
self.start(params) do |connection|
|
85
|
-
connection.session(params, &
|
71
|
+
connection.session(params, &block)
|
86
72
|
end
|
87
73
|
end
|
88
74
|
|
@@ -100,15 +86,13 @@ module JMS
|
|
100
86
|
# to load for this JMS Provider
|
101
87
|
#
|
102
88
|
# Returns nil
|
103
|
-
#
|
104
|
-
# TODO make this a class method
|
105
89
|
def fetch_dependencies(jar_list)
|
106
90
|
jar_list.each do |jar|
|
107
|
-
|
91
|
+
logger.debug "Loading Jar File:#{jar}"
|
108
92
|
begin
|
109
93
|
require jar
|
110
94
|
rescue Exception => exc
|
111
|
-
|
95
|
+
logger.error "Failed to Load Jar File:#{jar}", exc
|
112
96
|
end
|
113
97
|
end if jar_list
|
114
98
|
|
@@ -139,21 +123,21 @@ module JMS
|
|
139
123
|
# 2. Supply an instance of the JMS Provider class itself
|
140
124
|
# 3. Use a JNDI lookup to return the JMS Provider Factory class
|
141
125
|
# Parameters:
|
142
|
-
# :
|
143
|
-
#
|
126
|
+
# factory: [String] Name of JMS Provider Factory class
|
127
|
+
# [Class] JMS Provider Factory class itself
|
144
128
|
#
|
145
|
-
# :
|
146
|
-
# :
|
147
|
-
#
|
129
|
+
# jndi_name: [String] Name of JNDI entry at which the Factory can be found
|
130
|
+
# jndi_context: Mandatory if jndi lookup is being used, contains details
|
131
|
+
# on how to connect to JNDI server etc.
|
148
132
|
#
|
149
|
-
# :
|
150
|
-
#
|
151
|
-
#
|
152
|
-
#
|
133
|
+
# require_jars: [Array<String>] An optional array of Jar file names to load for the specified
|
134
|
+
# JMS provider. By using this option it is not necessary
|
135
|
+
# to put all the JMS Provider specific jar files into the
|
136
|
+
# environment variable CLASSPATH prior to starting JRuby
|
153
137
|
#
|
154
|
-
# :
|
155
|
-
# :
|
156
|
-
#
|
138
|
+
# username: [String] Username to connect to JMS provider with
|
139
|
+
# password: [String] Password to use when to connecting to the JMS provider
|
140
|
+
# Note: :password is ignored if :username is not supplied
|
157
141
|
#
|
158
142
|
# :factory and :jndi_name are mutually exclusive, both cannot be supplied at the
|
159
143
|
# same time. :factory takes precedence over :jndi_name
|
@@ -162,10 +146,9 @@ module JMS
|
|
162
146
|
# has setters for those properties.
|
163
147
|
#
|
164
148
|
# For some known examples, see: [Example jms.yml](https://github.com/reidmorrison/jruby-jms/blob/master/examples/jms.yml)
|
165
|
-
#
|
166
149
|
def initialize(params = {})
|
167
|
-
# Used by
|
168
|
-
@sessions
|
150
|
+
# Used by #on_message
|
151
|
+
@sessions = []
|
169
152
|
@consumers = []
|
170
153
|
|
171
154
|
options = params.dup
|
@@ -175,19 +158,17 @@ module JMS
|
|
175
158
|
fetch_dependencies(options.delete(:require_jars))
|
176
159
|
|
177
160
|
connection_factory = nil
|
178
|
-
factory
|
161
|
+
factory = options.delete(:factory)
|
179
162
|
if factory
|
180
163
|
# If factory check if oracle is needed.
|
181
|
-
if
|
182
|
-
require 'jms/oracle_a_q_connection_factory'
|
183
|
-
end
|
164
|
+
require('jms/oracle_a_q_connection_factory') if factory.include?('AQjmsFactory')
|
184
165
|
|
185
166
|
# If factory is a string, then it is the name of a class, not the class itself
|
186
|
-
factory
|
167
|
+
factory = eval(factory) if factory.respond_to?(:to_str)
|
187
168
|
connection_factory = factory.new
|
188
169
|
elsif jndi_name = options[:jndi_name]
|
189
|
-
raise
|
190
|
-
if jndi_context['java.naming.factory.initial'].include?
|
170
|
+
raise(ArgumentError, 'Missing mandatory parameter :jndi_context in call to Connection::connect') unless jndi_context = options[:jndi_context]
|
171
|
+
if jndi_context['java.naming.factory.initial'].include?('AQjmsInitialContextFactory')
|
191
172
|
require 'jms/oracle_a_q_connection_factory'
|
192
173
|
end
|
193
174
|
|
@@ -198,21 +179,21 @@ module JMS
|
|
198
179
|
jndi.close
|
199
180
|
end
|
200
181
|
else
|
201
|
-
raise
|
182
|
+
raise(ArgumentError, 'Missing mandatory parameter :factory or :jndi_name missing in call to Connection::connect')
|
202
183
|
end
|
203
184
|
options.delete(:jndi_name)
|
204
185
|
options.delete(:jndi_context)
|
205
186
|
|
206
|
-
|
187
|
+
logger.debug "Using Factory: #{connection_factory.java_class}" if connection_factory.respond_to? :java_class
|
207
188
|
options.each_pair do |key, val|
|
208
189
|
next if [:username, :password].include?(key)
|
209
190
|
|
210
191
|
method = key.to_s+'='
|
211
192
|
if connection_factory.respond_to? method
|
212
193
|
connection_factory.send method, val
|
213
|
-
|
194
|
+
logger.debug " #{key} = #{connection_factory.send key.to_sym}" if connection_factory.respond_to? key.to_sym
|
214
195
|
else
|
215
|
-
|
196
|
+
logger.warn "#{connection_factory.java_class} does not understand option: :#{key}=#{val}, ignoring :#{key}" if connection_factory.respond_to? :java_class
|
216
197
|
end
|
217
198
|
end
|
218
199
|
|
@@ -246,14 +227,14 @@ module JMS
|
|
246
227
|
# closed on completion of the code block
|
247
228
|
#
|
248
229
|
# Parameters:
|
249
|
-
# :
|
230
|
+
# transacted: [true|false]
|
250
231
|
# Determines whether transactions are supported within this session.
|
251
232
|
# I.e. Whether commit or rollback can be called
|
252
233
|
# Default: false
|
253
234
|
# Note: :options below are ignored if this value is set to :true
|
254
235
|
#
|
255
|
-
# :
|
256
|
-
# Note: :options are ignored if :
|
236
|
+
# options: any of the JMS::Session constants:
|
237
|
+
# Note: :options are ignored if transacted: true
|
257
238
|
# JMS::Session::AUTO_ACKNOWLEDGE
|
258
239
|
# With this acknowledgment mode, the session automatically acknowledges
|
259
240
|
# a client's receipt of a message either when the session has successfully
|
@@ -270,11 +251,11 @@ module JMS
|
|
270
251
|
# session is transacted.
|
271
252
|
# Default: JMS::Session::AUTO_ACKNOWLEDGE
|
272
253
|
#
|
273
|
-
def session(params={}, &
|
274
|
-
raise
|
254
|
+
def session(params={}, &block)
|
255
|
+
raise(ArgumentError, 'Missing mandatory Block when calling JMS::Connection#session') unless block
|
275
256
|
session = self.create_session(params)
|
276
257
|
begin
|
277
|
-
|
258
|
+
block.call(session)
|
278
259
|
ensure
|
279
260
|
session.close
|
280
261
|
end
|
@@ -288,14 +269,14 @@ module JMS
|
|
288
269
|
# possible
|
289
270
|
#
|
290
271
|
# Parameters:
|
291
|
-
# :
|
272
|
+
# transacted: true or false
|
292
273
|
# Determines whether transactions are supported within this session.
|
293
274
|
# I.e. Whether commit or rollback can be called
|
294
275
|
# Default: false
|
295
276
|
# Note: :options below are ignored if this value is set to :true
|
296
277
|
#
|
297
|
-
# :
|
298
|
-
# Note: :options are ignored if :
|
278
|
+
# options: any of the JMS::Session constants:
|
279
|
+
# Note: :options are ignored if transacted: true
|
299
280
|
# JMS::Session::AUTO_ACKNOWLEDGE
|
300
281
|
# With this acknowledgment mode, the session automatically acknowledges
|
301
282
|
# a client's receipt of a message either when the session has successfully
|
@@ -314,17 +295,17 @@ module JMS
|
|
314
295
|
#
|
315
296
|
def create_session(params={})
|
316
297
|
transacted = params[:transacted] || false
|
317
|
-
options
|
298
|
+
options = params[:options] || JMS::Session::AUTO_ACKNOWLEDGE
|
318
299
|
@jms_connection.create_session(transacted, options)
|
319
300
|
end
|
320
301
|
|
321
302
|
# Close connection with the JMS Provider
|
322
303
|
# First close any consumers or sessions that are active as a result of JMS::Connection::on_message
|
323
304
|
def close
|
324
|
-
@consumers.each {|consumer| consumer.close } if @consumers
|
305
|
+
@consumers.each { |consumer| consumer.close } if @consumers
|
325
306
|
@consumers = []
|
326
307
|
|
327
|
-
@sessions.each {|session| session.close} if @sessions
|
308
|
+
@sessions.each { |session| session.close } if @sessions
|
328
309
|
@session=[]
|
329
310
|
|
330
311
|
@jms_connection.close if @jms_connection
|
@@ -390,14 +371,14 @@ module JMS
|
|
390
371
|
# can then be processed.
|
391
372
|
#
|
392
373
|
# Session Parameters:
|
393
|
-
# :
|
374
|
+
# transacted: true or false
|
394
375
|
# Determines whether transactions are supported within this session.
|
395
376
|
# I.e. Whether commit or rollback can be called
|
396
377
|
# Default: false
|
397
378
|
# Note: :options below are ignored if this value is set to :true
|
398
379
|
#
|
399
|
-
# :
|
400
|
-
# Note: :options are ignored if :
|
380
|
+
# options: any of the JMS::Session constants:
|
381
|
+
# Note: :options are ignored if transacted: true
|
401
382
|
# JMS::Session::AUTO_ACKNOWLEDGE
|
402
383
|
# With this acknowledgment mode, the session automatically acknowledges
|
403
384
|
# a client's receipt of a message either when the session has successfully
|
@@ -423,20 +404,20 @@ module JMS
|
|
423
404
|
# Default: 1
|
424
405
|
#
|
425
406
|
# Consumer Parameters:
|
426
|
-
# :
|
427
|
-
# Symbol: :
|
407
|
+
# queue_name: String: Name of the Queue to return
|
408
|
+
# Symbol: temporary: Create temporary queue
|
428
409
|
# Mandatory unless :topic_name is supplied
|
429
410
|
# Or,
|
430
|
-
# :
|
431
|
-
# Symbol: :
|
411
|
+
# topic_name: String: Name of the Topic to write to or subscribe to
|
412
|
+
# Symbol: temporary: Create temporary topic
|
432
413
|
# Mandatory unless :queue_name is supplied
|
433
414
|
# Or,
|
434
|
-
# :
|
415
|
+
# destination:Explicit javaxJms::Destination to use
|
435
416
|
#
|
436
|
-
# :
|
417
|
+
# selector: Filter which messages should be returned from the queue
|
437
418
|
# Default: All messages
|
438
419
|
#
|
439
|
-
# :
|
420
|
+
# no_local: Determine whether messages published by its own connection
|
440
421
|
# should be delivered to the supplied block
|
441
422
|
# Default: false
|
442
423
|
#
|
@@ -447,7 +428,7 @@ module JMS
|
|
447
428
|
# or when Destination::statistics is called. In this case MessageConsumer::statistics
|
448
429
|
# can be called several times during processing without affecting the end time.
|
449
430
|
# Also, the start time and message count is not reset until MessageConsumer::each
|
450
|
-
# is called again with :
|
431
|
+
# is called again with statistics: true
|
451
432
|
#
|
452
433
|
# Usage: For transacted sessions the block supplied must return either true or false:
|
453
434
|
# true => The session is committed
|
@@ -458,11 +439,11 @@ module JMS
|
|
458
439
|
# since on_message will Not be called if the connection is lost
|
459
440
|
#
|
460
441
|
def on_message(params, &block)
|
461
|
-
raise
|
442
|
+
raise 'JMS::Connection must be connected prior to calling JMS::Connection::on_message' unless @sessions && @consumers
|
462
443
|
|
463
444
|
consumer_count = params[:session_count] || 1
|
464
445
|
consumer_count.times do
|
465
|
-
session
|
446
|
+
session = self.create_session(params)
|
466
447
|
consumer = session.consumer(params)
|
467
448
|
if session.transacted?
|
468
449
|
consumer.on_message(params) do |message|
|
@@ -520,7 +501,6 @@ module JMS
|
|
520
501
|
# producer.send(session.message("Hello World"))
|
521
502
|
# end
|
522
503
|
def create_session_pool(params={})
|
523
|
-
require 'jms/session_pool' unless defined? JMS::SessionPool
|
524
504
|
JMS::SessionPool.new(self, params)
|
525
505
|
end
|
526
506
|
|