jruby-jms 0.9.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/HISTORY.md +13 -0
- data/LICENSE.txt +201 -0
- data/README.md +276 -0
- data/Rakefile +22 -0
- data/examples/consumer.rb +23 -0
- data/examples/jms.yml +22 -0
- data/examples/log4j.properties +31 -0
- data/examples/performance/consumer.rb +27 -0
- data/examples/performance/producer.rb +31 -0
- data/examples/producer.rb +23 -0
- data/lib/jms.rb +25 -0
- data/lib/jms/connection.rb +480 -0
- data/lib/jms/javax_jms_map_message.rb +91 -0
- data/lib/jms/javax_jms_message.rb +264 -0
- data/lib/jms/javax_jms_message_consumer.rb +114 -0
- data/lib/jms/javax_jms_object_message.rb +26 -0
- data/lib/jms/javax_jms_queue_browser.rb +27 -0
- data/lib/jms/javax_jms_session.rb +285 -0
- data/lib/jms/javax_jms_text_message.rb +31 -0
- metadata +74 -0
@@ -0,0 +1,26 @@
|
|
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.ObjectMessage
|
18
|
+
module javax.jms::ObjectMessage
|
19
|
+
def data
|
20
|
+
getObject
|
21
|
+
end
|
22
|
+
|
23
|
+
def data(val)
|
24
|
+
setObject(val)
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
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
|
+
module javax.jms::QueueBrowser
|
18
|
+
# For each message on the queue call the supplied Proc
|
19
|
+
def each(parms={}, &proc)
|
20
|
+
raise "javax.jms.QueueBrowser::each requires a code block to be executed for each message received" unless proc
|
21
|
+
|
22
|
+
e = self.getEnumeration
|
23
|
+
while e.hasMoreElements
|
24
|
+
proc.call(e.nextElement)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,285 @@
|
|
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
|
+
# For each thread that will be processing messages concurrently a separate
|
18
|
+
# session is required. All sessions can share a single connection to the same
|
19
|
+
# JMS Provider.
|
20
|
+
#
|
21
|
+
# Interface javax.jms.Session
|
22
|
+
module javax.jms::Session
|
23
|
+
# Create a new message instance based on the type of the data being supplied
|
24
|
+
# String (:to_str) => TextMessage
|
25
|
+
# Hash (:each_pair) => MapMessage
|
26
|
+
# In fact duck typing is used to determine the type. If the class responds
|
27
|
+
# to :to_str then it is considered a String. Similarly if it responds to
|
28
|
+
# :each_pair it is considered to be a Hash
|
29
|
+
def message(data)
|
30
|
+
jms_message = nil
|
31
|
+
if data.respond_to?(:to_str, false)
|
32
|
+
jms_message = self.createTextMessage
|
33
|
+
jms_message.text = data.to_str
|
34
|
+
elsif data.respond_to?(:each_pair, false)
|
35
|
+
jms_message = self.createMapMessage
|
36
|
+
jms_message.data = data
|
37
|
+
else
|
38
|
+
raise "Unknown data type #{data.class.to_s} in Message"
|
39
|
+
end
|
40
|
+
jms_message
|
41
|
+
end
|
42
|
+
|
43
|
+
# Does the session support transactions?
|
44
|
+
# I.e. Can/should commit and rollback be called
|
45
|
+
def transacted?
|
46
|
+
self.getAcknowledgeMode == javax.jms.Session::SESSION_TRANSACTED
|
47
|
+
end
|
48
|
+
|
49
|
+
# Create and open a queue to put or get from. Once the supplied Proc is complete
|
50
|
+
# the queue is automatically closed. If no Proc is supplied then the queue must
|
51
|
+
# be explicitly closed by the caller.
|
52
|
+
def destination(parms={}, &proc)
|
53
|
+
parms[:jms_session] = self
|
54
|
+
q = JMS::Destination.new(parms)
|
55
|
+
q.open(parms)
|
56
|
+
if proc
|
57
|
+
begin
|
58
|
+
proc.call(q)
|
59
|
+
ensure
|
60
|
+
q.close
|
61
|
+
q = nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
q
|
65
|
+
end
|
66
|
+
|
67
|
+
# Return the queue matching the queue name supplied
|
68
|
+
# Call the Proc if supplied
|
69
|
+
def queue(q_name, &proc)
|
70
|
+
q = create_queue(q_name)
|
71
|
+
if proc
|
72
|
+
begin
|
73
|
+
proc.call(q)
|
74
|
+
ensure
|
75
|
+
q = nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
q
|
79
|
+
end
|
80
|
+
|
81
|
+
# Return a producer for the queue name supplied
|
82
|
+
# A producer supports sending messages to a Queue or a Topic
|
83
|
+
#
|
84
|
+
# Call the Proc if supplied, then automatically close the producer
|
85
|
+
#
|
86
|
+
# Parameters:
|
87
|
+
# :q_name => String: Name of the Queue to return
|
88
|
+
# Symbol: :temporary => Create temporary queue
|
89
|
+
# Mandatory unless :topic_name is supplied
|
90
|
+
# Or,
|
91
|
+
# :topic_name => String: Name of the Topic to write to or subscribe to
|
92
|
+
# Symbol: :temporary => Create temporary topic
|
93
|
+
# Mandatory unless :q_name is supplied
|
94
|
+
# Or,
|
95
|
+
# :destination=> Explicit javax.jms::Destination to use
|
96
|
+
def producer(parms, &proc)
|
97
|
+
destination = create_destination(parms)
|
98
|
+
# Call original java method with this destination
|
99
|
+
#p = java_send :create_producer, [javax.jms::Destination], destination
|
100
|
+
p = create_producer(destination)
|
101
|
+
if proc
|
102
|
+
begin
|
103
|
+
proc.call(p)
|
104
|
+
ensure
|
105
|
+
p.close
|
106
|
+
p = nil
|
107
|
+
end
|
108
|
+
end
|
109
|
+
p
|
110
|
+
end
|
111
|
+
|
112
|
+
# Return a consumer for the destination
|
113
|
+
# A consumer can read messages from the queue or topic
|
114
|
+
#
|
115
|
+
# Call the Proc if supplied, then automatically close the consumer
|
116
|
+
#
|
117
|
+
# Parameters:
|
118
|
+
# :q_name => String: Name of the Queue to return
|
119
|
+
# Symbol: :temporary => Create temporary queue
|
120
|
+
# Mandatory unless :topic_name is supplied
|
121
|
+
# Or,
|
122
|
+
# :topic_name => String: Name of the Topic to write to or subscribe to
|
123
|
+
# Symbol: :temporary => Create temporary topic
|
124
|
+
# Mandatory unless :q_name is supplied
|
125
|
+
# Or,
|
126
|
+
# :destination=> Explicit javaxJms::Destination to use
|
127
|
+
#
|
128
|
+
# :selector => Filter which messages should be returned from the queue
|
129
|
+
# Default: All messages
|
130
|
+
# :no_local => Determine whether messages published by its own connection
|
131
|
+
# should be delivered to it
|
132
|
+
# Default: false
|
133
|
+
def consumer(parms, &proc)
|
134
|
+
destination = create_destination(parms)
|
135
|
+
c = nil
|
136
|
+
if parms[:no_local]
|
137
|
+
c = create_consumer(destination, parms[:selector] || '', parms[:no_local])
|
138
|
+
elsif parms[:selector]
|
139
|
+
c = create_consumer(destination, parms[:selector])
|
140
|
+
else
|
141
|
+
c = create_consumer(destination)
|
142
|
+
end
|
143
|
+
|
144
|
+
if proc
|
145
|
+
begin
|
146
|
+
proc.call(c)
|
147
|
+
ensure
|
148
|
+
c.close
|
149
|
+
c = nil
|
150
|
+
end
|
151
|
+
end
|
152
|
+
c
|
153
|
+
end
|
154
|
+
|
155
|
+
# Consume all messages for the destination
|
156
|
+
# A consumer can read messages from the queue or topic
|
157
|
+
#
|
158
|
+
# Parameters:
|
159
|
+
# :q_name => String: Name of the Queue to return
|
160
|
+
# Symbol: :temporary => Create temporary queue
|
161
|
+
# Mandatory unless :topic_name is supplied
|
162
|
+
# Or,
|
163
|
+
# :topic_name => String: Name of the Topic to write to or subscribe to
|
164
|
+
# Symbol: :temporary => Create temporary topic
|
165
|
+
# Mandatory unless :q_name is supplied
|
166
|
+
# Or,
|
167
|
+
# :destination=> Explicit javaxJms::Destination to use
|
168
|
+
#
|
169
|
+
# :selector => Filter which messages should be returned from the queue
|
170
|
+
# Default: All messages
|
171
|
+
# :no_local => Determine whether messages published by its own connection
|
172
|
+
# should be delivered to it
|
173
|
+
# Default: false
|
174
|
+
#
|
175
|
+
# :timeout Follows the rules for MQSeries:
|
176
|
+
# -1 : Wait forever
|
177
|
+
# 0 : Return immediately if no message is available
|
178
|
+
# x : Wait for x milli-seconds for a message to be received from the broker
|
179
|
+
# Note: Messages may still be on the queue, but the broker has not supplied any messages
|
180
|
+
# in the time interval specified
|
181
|
+
# Default: 0
|
182
|
+
#
|
183
|
+
def consume(parms, &proc)
|
184
|
+
c = self.consumer(parms)
|
185
|
+
begin
|
186
|
+
c.each(parms, &proc)
|
187
|
+
ensure
|
188
|
+
c.close
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
# Return a browser for the destination
|
193
|
+
# A browser can read messages non-destructively from the queue
|
194
|
+
# It cannot browse Topics!
|
195
|
+
#
|
196
|
+
# Call the Proc if supplied, then automatically close the consumer
|
197
|
+
#
|
198
|
+
# Parameters:
|
199
|
+
# :q_name => String: Name of the Queue to return
|
200
|
+
# Symbol: :temporary => Create temporary queue
|
201
|
+
# Mandatory unless :topic_name is supplied
|
202
|
+
# Or,
|
203
|
+
# :destination=> Explicit javaxJms::Destination to use
|
204
|
+
#
|
205
|
+
# :selector => Filter which messages should be returned from the queue
|
206
|
+
# Default: All messages
|
207
|
+
def browser(parms, &proc)
|
208
|
+
raise "Session::browser requires a code block to be executed" unless proc
|
209
|
+
|
210
|
+
destination = create_destination(parms)
|
211
|
+
b = nil
|
212
|
+
if parms[:selector]
|
213
|
+
b = create_browser(destination, parms[:selector])
|
214
|
+
else
|
215
|
+
b = create_browser(destination)
|
216
|
+
end
|
217
|
+
|
218
|
+
if proc
|
219
|
+
begin
|
220
|
+
proc.call(b)
|
221
|
+
ensure
|
222
|
+
b.close
|
223
|
+
b = nil
|
224
|
+
end
|
225
|
+
end
|
226
|
+
b
|
227
|
+
end
|
228
|
+
|
229
|
+
# Browse the specified queue, calling the Proc supplied for each message found
|
230
|
+
#
|
231
|
+
# Parameters:
|
232
|
+
# :q_name => String: Name of the Queue to return
|
233
|
+
# Symbol: :temporary => Create temporary queue
|
234
|
+
# Mandatory unless :topic_name is supplied
|
235
|
+
# Or,
|
236
|
+
# :destination=> Explicit javaxJms::Destination to use
|
237
|
+
#
|
238
|
+
# :selector => Filter which messages should be returned from the queue
|
239
|
+
# Default: All messages
|
240
|
+
def browse(parms={}, &proc)
|
241
|
+
self.browser(parms) {|b| b.each(parms, &proc)}
|
242
|
+
end
|
243
|
+
|
244
|
+
private
|
245
|
+
# Create the destination based on the parameter supplied
|
246
|
+
#
|
247
|
+
# Parameters:
|
248
|
+
# :q_name => String: Name of the Queue to return
|
249
|
+
# Symbol: :temporary => Create temporary queue
|
250
|
+
# Mandatory unless :topic_name is supplied
|
251
|
+
# Or,
|
252
|
+
# :topic_name => String: Name of the Topic to write to or subscribe to
|
253
|
+
# Symbol: :temporary => Create temporary topic
|
254
|
+
# Mandatory unless :q_name is supplied
|
255
|
+
# Or,
|
256
|
+
# :destination=> Explicit javaxJms::Destination to use
|
257
|
+
def create_destination(parms)
|
258
|
+
return parms[:destination] if parms[:destination] && parms[:destination].kind_of?(javaxJms::Destination)
|
259
|
+
q_name = parms[:q_name]
|
260
|
+
topic_name = parms[:topic_name]
|
261
|
+
raise "Missing mandatory parameter :q_name or :topic_name to Session::producer, Session::consumer, or Session::browser" unless q_name || topic_name
|
262
|
+
|
263
|
+
if q_name
|
264
|
+
q_name == :temporary ? create_temporary_queue : create_queue(q_name)
|
265
|
+
else
|
266
|
+
topic_name == :temporary ? create_temporary_topic : create_topic(topic_name)
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
# Workaround for IBM MQ JMS implementation that implements an undocumented consume method
|
272
|
+
if defined? com.ibm.mq.jms::MQSession
|
273
|
+
class com.ibm.mq.jms::MQSession
|
274
|
+
def consume(parms, &proc)
|
275
|
+
result = nil
|
276
|
+
c = self.consumer(parms)
|
277
|
+
begin
|
278
|
+
result = c.each(parms, &proc)
|
279
|
+
ensure
|
280
|
+
c.close
|
281
|
+
end
|
282
|
+
result
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
@@ -0,0 +1,31 @@
|
|
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.TextMessage
|
18
|
+
module javax.jms::TextMessage
|
19
|
+
def data
|
20
|
+
getText
|
21
|
+
end
|
22
|
+
|
23
|
+
def data=(val)
|
24
|
+
setText(val.to_s)
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
data
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jruby-jms
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.9.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Reid Morrison
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-01-24 00:00:00 -05:00
|
14
|
+
default_executable:
|
15
|
+
dependencies: []
|
16
|
+
|
17
|
+
description: JRuby-JMS is a Java and Ruby library that exposes the Java JMS API in a ruby friendly way. For JRuby only.
|
18
|
+
email: rubywmq@gmail.com
|
19
|
+
executables: []
|
20
|
+
|
21
|
+
extensions: []
|
22
|
+
|
23
|
+
extra_rdoc_files: []
|
24
|
+
|
25
|
+
files:
|
26
|
+
- HISTORY.md
|
27
|
+
- LICENSE.txt
|
28
|
+
- Rakefile
|
29
|
+
- README.md
|
30
|
+
- examples/consumer.rb
|
31
|
+
- examples/jms.yml
|
32
|
+
- examples/log4j.properties
|
33
|
+
- examples/producer.rb
|
34
|
+
- examples/performance/consumer.rb
|
35
|
+
- examples/performance/producer.rb
|
36
|
+
- lib/jms.rb
|
37
|
+
- lib/jms/connection.rb
|
38
|
+
- lib/jms/javax_jms_map_message.rb
|
39
|
+
- lib/jms/javax_jms_message.rb
|
40
|
+
- lib/jms/javax_jms_message_consumer.rb
|
41
|
+
- lib/jms/javax_jms_object_message.rb
|
42
|
+
- lib/jms/javax_jms_queue_browser.rb
|
43
|
+
- lib/jms/javax_jms_session.rb
|
44
|
+
- lib/jms/javax_jms_text_message.rb
|
45
|
+
has_rdoc: true
|
46
|
+
homepage: https://github.com/reidmorrison/jruby-jms
|
47
|
+
licenses: []
|
48
|
+
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: "0"
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: "0"
|
66
|
+
requirements: []
|
67
|
+
|
68
|
+
rubyforge_project:
|
69
|
+
rubygems_version: 1.4.2
|
70
|
+
signing_key:
|
71
|
+
specification_version: 3
|
72
|
+
summary: JRuby interface into JMS
|
73
|
+
test_files: []
|
74
|
+
|