jruby-hornetq 0.2.1.alpha → 0.2.3.alpha
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/examples/advanced/transaction-failover/README +20 -0
- data/examples/advanced/transaction-failover/consumer.rb +35 -0
- data/examples/advanced/transaction-failover/hornetq.yml +29 -0
- data/examples/advanced/transaction-failover/producer.rb +44 -0
- data/examples/client/advanced/batch_client.rb +2 -2
- data/examples/client/advanced/bytes_producer.rb +21 -0
- data/examples/client/advanced/client.rb +2 -2
- data/examples/client/advanced/consumer.rb +1 -1
- data/examples/client/advanced/multi_client.rb +1 -1
- data/examples/client/advanced/producer.rb +2 -2
- data/examples/client/advanced/server.rb +2 -2
- data/examples/client/data/bindings/hornetq-bindings-1.bindings +0 -0
- data/examples/client/data/bindings/hornetq-bindings-2.bindings +0 -0
- data/examples/client/data/journal/hornetq-data-1.hq +0 -0
- data/examples/client/data/journal/hornetq-data-2.hq +0 -0
- data/examples/client/invm.rb +1 -1
- data/examples/client/producer.rb +2 -2
- data/lib/hornetq/client/factory.rb +61 -68
- data/lib/hornetq/client/org_hornetq_core_client_impl_client_message_impl.rb +52 -66
- data/lib/hornetq/client/session_pool.rb +1 -1
- data/lib/hornetq/server/factory.rb +18 -17
- data/test/server_factory_test.rb +7 -8
- metadata +16 -19
data/Rakefile
CHANGED
@@ -8,7 +8,7 @@ desc "Build gem"
|
|
8
8
|
task :gem do |t|
|
9
9
|
gemspec = Gem::Specification.new do |s|
|
10
10
|
s.name = 'jruby-hornetq'
|
11
|
-
s.version = '0.2.
|
11
|
+
s.version = '0.2.3.alpha'
|
12
12
|
s.authors = ['Reid Morrison', 'Brad Pardee']
|
13
13
|
s.email = ['rubywmq@gmail.com', 'bpardee@gmail.com']
|
14
14
|
s.homepage = 'https://github.com/ClarityServices/jruby-hornetq'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Window 1:
|
2
|
+
# Step 1
|
3
|
+
rm -rf data data_backup
|
4
|
+
hornetq_server hornetq.yml backup_server
|
5
|
+
# Wait for HornetQ Server version ... started
|
6
|
+
|
7
|
+
# Window 2:
|
8
|
+
# Step 2
|
9
|
+
hornetq_server hornetq.yml live_server &
|
10
|
+
# Step 5
|
11
|
+
# View window 3&4 looking for "1000" signifying that 1000 messages have been produced/consumed
|
12
|
+
kill -9 %1 (or whatever the background job id for the server is) (or start in the foreground and just cntl-c)
|
13
|
+
|
14
|
+
# Window 3:
|
15
|
+
# Step 3
|
16
|
+
./producer.rb 10000
|
17
|
+
|
18
|
+
# Window 4:
|
19
|
+
# Step 4
|
20
|
+
./consumer.rb
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env jruby
|
2
|
+
#
|
3
|
+
# HornetQ Consumer:
|
4
|
+
# Write messages to the queue
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
require 'yaml'
|
9
|
+
require 'hornetq'
|
10
|
+
|
11
|
+
timeout = (ARGV[0] || 3000).to_i
|
12
|
+
|
13
|
+
config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')
|
14
|
+
constants = config['constants']
|
15
|
+
|
16
|
+
# Create a HornetQ session
|
17
|
+
HornetQ::Client::Factory.session(config['client']) do |session|
|
18
|
+
consumer = session.create_consumer(constants[:queue])
|
19
|
+
session.start
|
20
|
+
|
21
|
+
i = 0
|
22
|
+
start_time = Time.now
|
23
|
+
while message = consumer.receive(timeout)
|
24
|
+
i += 1
|
25
|
+
message.acknowledge
|
26
|
+
expected_message = "Message ##{i}"
|
27
|
+
if message.body != expected_message
|
28
|
+
puts "Unexpected message: #{message.body} Expected: #{expected_message}"
|
29
|
+
i = $1.to_i if message.body =~ /Message #(\d+)/
|
30
|
+
end
|
31
|
+
puts "#{i}\n" if i%1000 == 0
|
32
|
+
end
|
33
|
+
duration = Time.now - start_time - timeout/1000
|
34
|
+
puts "Received #{i} messages in #{duration} seconds at #{i/duration} messages per second"
|
35
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
backup_server:
|
2
|
+
:uri: hornetq://localhost:15446
|
3
|
+
:backup: true
|
4
|
+
:data_directory: ./data_backup
|
5
|
+
:persistence_enabled: true
|
6
|
+
:security_enabled: false
|
7
|
+
|
8
|
+
live_server:
|
9
|
+
:uri: hornetq://localhost:15445,localhost:15446
|
10
|
+
:data_directory: ./data
|
11
|
+
:persistence_enabled: true
|
12
|
+
:security_enabled: false
|
13
|
+
|
14
|
+
client:
|
15
|
+
:connector:
|
16
|
+
:uri: hornetq://localhost:15445,localhost:15446
|
17
|
+
:failover_on_initial_connection: true
|
18
|
+
:failover_on_server_shutdown: true
|
19
|
+
# 5 Connection attempts takes about 16 seconds before it switches to the backup server
|
20
|
+
:reconnect_attempts: 5
|
21
|
+
|
22
|
+
:session:
|
23
|
+
:username: guest
|
24
|
+
:password: guest
|
25
|
+
|
26
|
+
constants:
|
27
|
+
:address: test_address
|
28
|
+
:queue: test_queue
|
29
|
+
:durable: true
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env jruby
|
2
|
+
#
|
3
|
+
# HornetQ Producer:
|
4
|
+
# Write messages to the queue
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
require 'yaml'
|
9
|
+
require 'hornetq'
|
10
|
+
|
11
|
+
count = (ARGV[0] || 1).to_i
|
12
|
+
config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')
|
13
|
+
constants = config['constants']
|
14
|
+
|
15
|
+
# Create a HornetQ session
|
16
|
+
HornetQ::Client::Factory.session(config['client']) do |session|
|
17
|
+
session.delete_queue(constants[:queue]) rescue nil
|
18
|
+
session.create_queue(constants[:address], constants[:queue], constants[:durable])
|
19
|
+
producer = session.create_producer(constants[:address])
|
20
|
+
start_time = Time.now
|
21
|
+
|
22
|
+
puts "Sending messages"
|
23
|
+
(1..count).each do |i|
|
24
|
+
message = session.create_message(HornetQ::Client::Message::TEXT_TYPE, true)
|
25
|
+
# Set the message body text
|
26
|
+
message.body = "Message ##{i}"
|
27
|
+
message.put_string_property(Java::org.hornetq.api.core.SimpleString.new(HornetQ::Client::Message::HDR_DUPLICATE_DETECTION_ID.to_s), Java::org.hornetq.api.core.SimpleString.new("uniqueid#{i}"))
|
28
|
+
# Send message to the queue
|
29
|
+
begin
|
30
|
+
producer.send(message)
|
31
|
+
rescue Java::org.hornetq.api.core.HornetQException => e
|
32
|
+
puts "Received producer exception: #{e.message} with code=#{e.cause.code}"
|
33
|
+
if e.cause.code == Java::org.hornetq.api.core.HornetQException::UNBLOCKED
|
34
|
+
puts "Retrying the send"
|
35
|
+
retry
|
36
|
+
end
|
37
|
+
end
|
38
|
+
#puts message
|
39
|
+
puts "#{i}\n" if i%1000 == 0
|
40
|
+
end
|
41
|
+
|
42
|
+
duration = Time.now - start_time
|
43
|
+
puts "Delivered #{count} messages in #{duration} seconds at #{count/duration} messages per second"
|
44
|
+
end
|
@@ -64,7 +64,7 @@ class BatchClient
|
|
64
64
|
total_count.times do |i|
|
65
65
|
message = @session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
|
66
66
|
message.reply_to_queue_name = @consumer.queue_name
|
67
|
-
message
|
67
|
+
message.body = "Request Current Time. #{i}"
|
68
68
|
@producer.send(message)
|
69
69
|
print "."
|
70
70
|
#puts "Sent:#{message}"
|
@@ -96,7 +96,7 @@ class BatchClient
|
|
96
96
|
end
|
97
97
|
|
98
98
|
# Create a HornetQ session
|
99
|
-
HornetQ::Client::Factory.
|
99
|
+
HornetQ::Client::Factory.session(config) do |session|
|
100
100
|
batching_size = total_count if batching_size > total_count
|
101
101
|
|
102
102
|
client = BatchClient.new(session, request_address)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#
|
2
|
+
# HornetQ Producer:
|
3
|
+
# Write messages to the queue
|
4
|
+
#
|
5
|
+
|
6
|
+
# Allow examples to be run in-place without requiring a gem install
|
7
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../../../lib'
|
8
|
+
|
9
|
+
require 'rubygems'
|
10
|
+
require 'hornetq'
|
11
|
+
|
12
|
+
HornetQ::Client::Factory.session('hornetq://localhost') do |session|
|
13
|
+
# Create Producer so that we can send messages to the Address 'jms.queue.ExampleQueue'
|
14
|
+
producer = session.create_producer('jms.queue.ExampleQueue')
|
15
|
+
|
16
|
+
# Create a non-durable message to send
|
17
|
+
message = session.create_message(HornetQ::Client::Message::BYTES_TYPE,false)
|
18
|
+
message.body = "#{Time.now}: ### Hello, World ###"
|
19
|
+
|
20
|
+
producer.send(message)
|
21
|
+
end
|
@@ -16,7 +16,7 @@ timeout = (ARGV[1] || 30000).to_i
|
|
16
16
|
config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
|
17
17
|
|
18
18
|
# Create a HornetQ session
|
19
|
-
HornetQ::Client::Factory.
|
19
|
+
HornetQ::Client::Factory.session(config) do |session|
|
20
20
|
#session.create_queue('Example', 'Example', true)
|
21
21
|
requestor = session.create_requestor('jms.queue.ExampleQueue')
|
22
22
|
session.start
|
@@ -26,7 +26,7 @@ HornetQ::Client::Factory.create_session(config) do |session|
|
|
26
26
|
(1..count).each do |i|
|
27
27
|
message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
|
28
28
|
# Set the message body text
|
29
|
-
message
|
29
|
+
message.body = "Request Current Time"
|
30
30
|
# Set the user managed message id
|
31
31
|
message.user_id = Java::org.hornetq.utils::UUIDGenerator.getInstance.generateUUID
|
32
32
|
# Send request message and wait for reply
|
@@ -15,7 +15,7 @@ timeout = (ARGV[0] || 1000).to_i
|
|
15
15
|
config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
|
16
16
|
|
17
17
|
# Create a HornetQ session
|
18
|
-
HornetQ::Client::Factory.
|
18
|
+
HornetQ::Client::Factory.session(config) do |session|
|
19
19
|
consumer = session.create_consumer('jms.queue.ExampleQueue')
|
20
20
|
session.start
|
21
21
|
|
@@ -26,7 +26,7 @@ def worker_thread(id, session_pool)
|
|
26
26
|
# Obtain a session from the pool and return when complete
|
27
27
|
session_pool.requestor('jms.queue.ExampleQueue') do |session, requestor|
|
28
28
|
message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
|
29
|
-
message
|
29
|
+
message.body = "Request Current Time"
|
30
30
|
|
31
31
|
# Send message to the queue
|
32
32
|
puts "Thread[#{id}]: Sending Request"
|
@@ -14,7 +14,7 @@ count = (ARGV[0] || 1).to_i
|
|
14
14
|
config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
|
15
15
|
|
16
16
|
# Create a HornetQ session
|
17
|
-
HornetQ::Client::Factory.
|
17
|
+
HornetQ::Client::Factory.session(config) do |session|
|
18
18
|
producer = session.create_producer('jms.queue.ExampleQueue')
|
19
19
|
start_time = Time.now
|
20
20
|
|
@@ -22,7 +22,7 @@ HornetQ::Client::Factory.create_session(config) do |session|
|
|
22
22
|
(1..count).each do |i|
|
23
23
|
message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
|
24
24
|
# Set the message body text
|
25
|
-
message
|
25
|
+
message.body = "#{Time.now}: ### Hello, World ###"
|
26
26
|
# Send message to the queue
|
27
27
|
producer.send(message)
|
28
28
|
#puts message
|
@@ -15,7 +15,7 @@ timeout = (ARGV[0] || 60000).to_i
|
|
15
15
|
config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
|
16
16
|
|
17
17
|
# Create a HornetQ session
|
18
|
-
HornetQ::Client::Factory.
|
18
|
+
HornetQ::Client::Factory.session(config) do |session|
|
19
19
|
server = session.create_server('jms.queue.ExampleQueue', timeout)
|
20
20
|
session.start
|
21
21
|
|
@@ -28,7 +28,7 @@ HornetQ::Client::Factory.create_session(config) do |session|
|
|
28
28
|
puts "#{count}" if count%1000 == 0
|
29
29
|
puts "Durable" if request_message.durable
|
30
30
|
reply_message = session.create_message(HornetQ::Client::Message::TEXT_TYPE, false)
|
31
|
-
reply_message
|
31
|
+
reply_message.body = "Test Response"
|
32
32
|
reply_message
|
33
33
|
end
|
34
34
|
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/examples/client/invm.rb
CHANGED
@@ -22,7 +22,7 @@ HornetQ::Server::Factory.start('hornetq://invm') do |server|
|
|
22
22
|
|
23
23
|
# Create a non-durable message to send
|
24
24
|
message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
|
25
|
-
message
|
25
|
+
message.body = "#{Time.now}: ### Hello, World ###"
|
26
26
|
|
27
27
|
producer.send(message)
|
28
28
|
|
data/examples/client/producer.rb
CHANGED
@@ -9,13 +9,13 @@ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
|
|
9
9
|
require 'rubygems'
|
10
10
|
require 'hornetq'
|
11
11
|
|
12
|
-
HornetQ::Client::Factory.
|
12
|
+
HornetQ::Client::Factory.session('hornetq://localhost') do |session|
|
13
13
|
# Create Producer so that we can send messages to the Address 'jms.queue.ExampleQueue'
|
14
14
|
producer = session.create_producer('jms.queue.ExampleQueue')
|
15
15
|
|
16
16
|
# Create a non-durable message to send
|
17
17
|
message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
|
18
|
-
message
|
18
|
+
message.body = "#{Time.now}: ### Hello, World ###"
|
19
19
|
|
20
20
|
producer.send(message)
|
21
21
|
end
|
@@ -155,12 +155,8 @@ module HornetQ::Client
|
|
155
155
|
|
156
156
|
# Create a new HornetQ session
|
157
157
|
#
|
158
|
-
#
|
159
|
-
#
|
160
|
-
# always closed once the proc completes
|
161
|
-
#
|
162
|
-
# If no block is passed, a new session is returned and it is the responsibility
|
163
|
-
# of the caller to close the session
|
158
|
+
# Note: Remember to close the session once it is no longer used.
|
159
|
+
# Recommend using #session with a block over this method where possible
|
164
160
|
#
|
165
161
|
# Note:
|
166
162
|
# * The returned session MUST be closed once complete
|
@@ -169,11 +165,6 @@ module HornetQ::Client
|
|
169
165
|
# ...
|
170
166
|
# session.close
|
171
167
|
# factory.close
|
172
|
-
# * It is recommended to rather call HornetQ::Client::Factory.create_session
|
173
|
-
# so that all resouces are closed automatically
|
174
|
-
# HornetQ::Client::Factory.create_session(:uri => 'hornetq://localhost/') do |session|
|
175
|
-
# ...
|
176
|
-
# end
|
177
168
|
#
|
178
169
|
# Returns:
|
179
170
|
# * A new HornetQ ClientSession
|
@@ -187,31 +178,6 @@ module HornetQ::Client
|
|
187
178
|
# require 'hornetq'
|
188
179
|
#
|
189
180
|
# factory = nil
|
190
|
-
# begin
|
191
|
-
# factory = HornetQ::Client::Factory.new(:uri => 'hornetq://localhost/')
|
192
|
-
# factory.create_session do |session|
|
193
|
-
#
|
194
|
-
# # Create a new queue
|
195
|
-
# session.create_queue('Example', 'Example', true)
|
196
|
-
#
|
197
|
-
# # Create a producer to send messages
|
198
|
-
# producer = session.create_producer('Example')
|
199
|
-
#
|
200
|
-
# # Create a Text Message
|
201
|
-
# message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,true)
|
202
|
-
# message << 'Hello World'
|
203
|
-
#
|
204
|
-
# # Send the message
|
205
|
-
# producer.send(message)
|
206
|
-
# end
|
207
|
-
# ensure
|
208
|
-
# factory.close if factory
|
209
|
-
# end
|
210
|
-
#
|
211
|
-
# Example:
|
212
|
-
# require 'hornetq'
|
213
|
-
#
|
214
|
-
# factory = nil
|
215
181
|
# session = nil
|
216
182
|
# begin
|
217
183
|
# factory = HornetQ::Client::Factory.new(:uri => 'hornetq://localhost/')
|
@@ -280,37 +246,64 @@ module HornetQ::Client
|
|
280
246
|
# * :ack_batch_size
|
281
247
|
# * the batch size of the acknowledgements
|
282
248
|
#
|
283
|
-
def create_session(params={}
|
249
|
+
def create_session(params={})
|
284
250
|
raise "HornetQ::Client::Factory Already Closed" unless @factory
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
params[:auto_commit_sends].nil? ? true : params[:auto_commit_sends],
|
294
|
-
params[:auto_commit_acks].nil? ? true : params[:auto_commit_acks],
|
295
|
-
params[:pre_acknowledge] || false,
|
296
|
-
params[:ack_batch_size] || 1)
|
297
|
-
result = proc.call(session)
|
298
|
-
ensure
|
299
|
-
session.close if session
|
300
|
-
end
|
301
|
-
result
|
302
|
-
else
|
303
|
-
@factory.create_session(
|
304
|
-
params[:username],
|
305
|
-
params[:password],
|
306
|
-
params[:xa] || false,
|
307
|
-
params[:auto_commit_sends].nil? ? true : params[:auto_commit_sends],
|
308
|
-
params[:auto_commit_acks].nil? ? true : params[:auto_commit_acks],
|
309
|
-
params[:pre_acknowledge] || false,
|
310
|
-
params[:ack_batch_size] || 1)
|
311
|
-
end
|
251
|
+
@factory.create_session(
|
252
|
+
params[:username],
|
253
|
+
params[:password],
|
254
|
+
params[:xa] || false,
|
255
|
+
params[:auto_commit_sends].nil? ? true : params[:auto_commit_sends],
|
256
|
+
params[:auto_commit_acks].nil? ? true : params[:auto_commit_acks],
|
257
|
+
params[:pre_acknowledge] || false,
|
258
|
+
params[:ack_batch_size] || 1)
|
312
259
|
end
|
313
260
|
|
261
|
+
# Create a session, call the supplied block and once it completes
|
262
|
+
# close the session.
|
263
|
+
# See session_create for the Parameters
|
264
|
+
#
|
265
|
+
# Returns the result of the block
|
266
|
+
#
|
267
|
+
# Example
|
268
|
+
# HornetQ::Client::Factory.create_session(:uri => 'hornetq://localhost/') do |session|
|
269
|
+
# session.create_queue("Address", "Queue")
|
270
|
+
# end
|
271
|
+
#
|
272
|
+
# Example:
|
273
|
+
# require 'hornetq'
|
274
|
+
#
|
275
|
+
# factory = nil
|
276
|
+
# begin
|
277
|
+
# factory = HornetQ::Client::Factory.new(:uri => 'hornetq://localhost/')
|
278
|
+
# factory.create_session do |session|
|
279
|
+
#
|
280
|
+
# # Create a new queue
|
281
|
+
# session.create_queue('Example', 'Example', true)
|
282
|
+
#
|
283
|
+
# # Create a producer to send messages
|
284
|
+
# producer = session.create_producer('Example')
|
285
|
+
#
|
286
|
+
# # Create a Text Message
|
287
|
+
# message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,true)
|
288
|
+
# message.body = 'Hello World'
|
289
|
+
#
|
290
|
+
# # Send the message
|
291
|
+
# producer.send(message)
|
292
|
+
# end
|
293
|
+
# ensure
|
294
|
+
# factory.close if factory
|
295
|
+
# end
|
296
|
+
def session(params={}, &proc)
|
297
|
+
raise "HornetQ::Client::session mandatory block missing" unless proc
|
298
|
+
session = nil
|
299
|
+
begin
|
300
|
+
session = create_session(params)
|
301
|
+
proc.call(session)
|
302
|
+
ensure
|
303
|
+
session.close if session
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
314
307
|
# Create a Session pool
|
315
308
|
# TODO Raise an exception when gene_pool is not available
|
316
309
|
def create_session_pool(params={})
|
@@ -330,7 +323,7 @@ module HornetQ::Client
|
|
330
323
|
# block. Upon completion the session and factory are both closed
|
331
324
|
# See Factory::initialize and Factory::create_session for the list
|
332
325
|
# of parameters
|
333
|
-
def self.
|
326
|
+
def self.session(params={},&proc)
|
334
327
|
raise "Missing mandatory code block" unless proc
|
335
328
|
factory = nil
|
336
329
|
session = nil
|
@@ -338,10 +331,10 @@ module HornetQ::Client
|
|
338
331
|
if params.kind_of?(String)
|
339
332
|
# TODO: Support passing username and password from URI to Session
|
340
333
|
factory = self.new(params)
|
341
|
-
session = factory.
|
334
|
+
session = factory.session({}, &proc)
|
342
335
|
else
|
343
336
|
factory = self.new(params[:connector] || {})
|
344
|
-
session = factory.
|
337
|
+
session = factory.session(params[:session] || {}, &proc)
|
345
338
|
end
|
346
339
|
ensure
|
347
340
|
session.close if session
|
@@ -356,7 +349,7 @@ module HornetQ::Client
|
|
356
349
|
# See Factory::initialize and Factory::create_session for the list
|
357
350
|
# of parameters
|
358
351
|
def self.start(params={},&proc)
|
359
|
-
|
352
|
+
session(params) do |session|
|
360
353
|
session.start
|
361
354
|
proc.call(session)
|
362
355
|
end
|
@@ -48,12 +48,35 @@ class Java::OrgHornetqCoreClientImpl::ClientMessageImpl
|
|
48
48
|
case type
|
49
49
|
when Java::org.hornetq.api.core.Message::BYTES_TYPE #4
|
50
50
|
buf = body_buffer
|
51
|
-
|
51
|
+
buf.reset_reader_index
|
52
|
+
available = body_size
|
53
|
+
result = ""
|
54
|
+
bytes_size = 1024
|
55
|
+
bytes = Java::byte[bytes_size].new
|
56
|
+
|
57
|
+
while (n = available < bytes_size ? available : bytes_size) > 0
|
58
|
+
buf.read_bytes(bytes, 0, n)
|
59
|
+
if n == bytes_size
|
60
|
+
result << String.from_java_bytes(bytes)
|
61
|
+
else
|
62
|
+
result << String.from_java_bytes(bytes)[0..n-1]
|
63
|
+
end
|
64
|
+
available -= n
|
65
|
+
end
|
66
|
+
result
|
67
|
+
|
52
68
|
when Java::org.hornetq.api.core.Message::DEFAULT_TYPE #0
|
69
|
+
#TODO Default Type?
|
70
|
+
|
53
71
|
when Java::org.hornetq.api.core.Message::MAP_TYPE #5
|
54
72
|
Java::org.hornetq.utils::TypedProperties.new.decode(body_buffer)
|
73
|
+
|
55
74
|
when Java::org.hornetq.api.core.Message::OBJECT_TYPE #2
|
75
|
+
# TODO Java Object Type
|
76
|
+
|
56
77
|
when Java::org.hornetq.api.core.Message::STREAM_TYPE #6
|
78
|
+
#TODO Stream Type
|
79
|
+
|
57
80
|
when Java::org.hornetq.api.core.Message::TEXT_TYPE #3
|
58
81
|
body_buffer.read_nullable_simple_string.to_string
|
59
82
|
else
|
@@ -63,89 +86,52 @@ class Java::OrgHornetqCoreClientImpl::ClientMessageImpl
|
|
63
86
|
|
64
87
|
# Write data into the message body
|
65
88
|
#
|
89
|
+
# Note: The message type Must be set before calling this method
|
90
|
+
#
|
66
91
|
# Data is automatically converted based on the message type
|
67
92
|
#
|
68
|
-
|
69
|
-
|
93
|
+
def body=(data)
|
94
|
+
body_buffer.reset_writer_index
|
70
95
|
case type
|
96
|
+
|
71
97
|
when Java::org.hornetq.api.core.Message::BYTES_TYPE #4
|
72
|
-
body_buffer.write_bytes(data)
|
73
|
-
|
74
|
-
raise "Cannot use Message#<< when the Message#type has not been set"
|
98
|
+
body_buffer.write_bytes(data.respond_to?(:to_java_bytes) ? data.to_java_bytes : data)
|
99
|
+
|
75
100
|
when Java::org.hornetq.api.core.Message::MAP_TYPE #5
|
76
|
-
if data.
|
77
|
-
body_buffer.reset_writer_index
|
101
|
+
if data.kind_of? Java::org.hornetq.utils::TypedProperties
|
78
102
|
data.encode(body_buffer)
|
79
103
|
elsif data.responds_to? :each_pair
|
104
|
+
# Ruby Hash, or anything that responds to :each_pair
|
105
|
+
# TODO What about Hash inside of Hash?
|
80
106
|
properties = Java::org.hornetq.utils::TypedProperties.new
|
81
|
-
|
82
|
-
|
107
|
+
data.each_pair do |key, val|
|
108
|
+
properties[key.to_s] = val
|
109
|
+
end
|
83
110
|
properties.encode(body_buffer)
|
111
|
+
else
|
112
|
+
raise "Unrecognized data type #{data.class.name} being set when the message type is MAP"
|
84
113
|
end
|
114
|
+
|
85
115
|
when Java::org.hornetq.api.core.Message::OBJECT_TYPE #2
|
116
|
+
# Serialize Java Object
|
117
|
+
# TODO Should we do the serialize here?
|
118
|
+
body_buffer.write_bytes(data)
|
119
|
+
|
86
120
|
when Java::org.hornetq.api.core.Message::STREAM_TYPE #6
|
121
|
+
# TODO Stream Type
|
122
|
+
|
87
123
|
when Java::org.hornetq.api.core.Message::TEXT_TYPE #3
|
88
|
-
if data.
|
124
|
+
if data.kind_of? Java::org.hornetq.api.core::SimpleString
|
89
125
|
body_buffer.writeNullableSimpleString(data)
|
90
126
|
else
|
91
127
|
body_buffer.writeNullableSimpleString(Java::org.hornetq.api.core::SimpleString.new(data.to_s))
|
92
128
|
end
|
129
|
+
|
130
|
+
when Java::org.hornetq.api.core.Message::DEFAULT_TYPE #0
|
131
|
+
raise "The Message#type must be set before attempting to set the message body"
|
132
|
+
|
93
133
|
else
|
94
|
-
raise "Unknown Message Type, use Message#body_buffer
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
# Set the body of the message
|
99
|
-
# The type of the message is automatically set based on the type passed in.
|
100
|
-
# The following types are automatically supported in order of priority
|
101
|
-
# String => :text
|
102
|
-
# Java::org.hornetq.api.core::SimpleString => :text
|
103
|
-
# Java::org.hornetq.utils::TypedProperties => :map
|
104
|
-
# Hash (actually any object responding to => :map
|
105
|
-
def body=(data)
|
106
|
-
body_buffer.reset_writer_index
|
107
|
-
if data.is_a? String
|
108
|
-
# Ruby String
|
109
|
-
self.type = Java::org.hornetq.api.core.Message::TEXT_TYPE
|
110
|
-
body_buffer.writeNullableSimpleString(Java::org.hornetq.api.core::SimpleString.new(data))
|
111
|
-
elsif data.is_a? Java::org.hornetq.api.core::SimpleString
|
112
|
-
# SimpleString instance
|
113
|
-
self.type = Java::org.hornetq.api.core.Message::TEXT_TYPE
|
114
|
-
body_buffer.writeNullableSimpleString(data)
|
115
|
-
elsif data.is_a? Java::org.hornetq.utils::TypedProperties
|
116
|
-
# TypedProperties
|
117
|
-
self.type = Java::org.hornetq.api.core.Message::MAP_TYPE
|
118
|
-
data.encode(body_buffer)
|
119
|
-
elsif data.responds_to? :each_pair
|
120
|
-
# Ruby Hash, or anything that responds to :each_pair
|
121
|
-
# TODO What about Hash inside of Hash?
|
122
|
-
self.type = Java::org.hornetq.api.core.Message::MAP_TYPE
|
123
|
-
properties = Java::org.hornetq.utils::TypedProperties.new
|
124
|
-
data.each_pair do |key, val|
|
125
|
-
properties[key.to_s] = val
|
126
|
-
end
|
127
|
-
properties.encode(body_buffer)
|
128
|
-
elsif data.responds_to? :to_s
|
129
|
-
# Can be converted to a Ruby String
|
130
|
-
self.type = Java::org.hornetq.api.core.Message::TEXT_TYPE
|
131
|
-
body_buffer.writeNullableSimpleString(Java::org.hornetq.api.core::SimpleString.new(data.to_s))
|
132
|
-
else
|
133
|
-
# Otherwise Serialize Ruby object
|
134
|
-
self.type = Java::org.hornetq.api.core.Message::BYTES_TYPE
|
135
|
-
self['encoding', 'jruby']
|
136
|
-
# If BYTES type is not working we could use Base64.encode64
|
137
|
-
self << Marshal.dump(data)
|
138
|
-
self.text = encoded
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
# Serialize JRuby object and base64 encode
|
143
|
-
def decode
|
144
|
-
if self.get_string_property( 'torquebox_encoding' ) == 'base64'
|
145
|
-
serialized = Base64.decode64( self.text )
|
146
|
-
Marshal.restore( serialized )
|
147
|
-
else
|
148
|
-
self.text
|
134
|
+
raise "Unknown Message Type, use Message#body_buffer directly"
|
149
135
|
end
|
150
136
|
end
|
151
137
|
|
@@ -95,7 +95,7 @@ module HornetQ::Client
|
|
95
95
|
# Example
|
96
96
|
# session_pool.producer('MyAddress') do |session, producer|
|
97
97
|
# message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
|
98
|
-
# message
|
98
|
+
# message.body = "#{Time.now}: ### Hello, World ###"
|
99
99
|
# producer.send(message)
|
100
100
|
# end
|
101
101
|
def producer(address, &block)
|
@@ -20,25 +20,10 @@ module HornetQ::Server
|
|
20
20
|
config.journal_directory = "#{data_directory}/journal"
|
21
21
|
config.large_messages_directory = "#{data_directory}/large-messages"
|
22
22
|
|
23
|
-
parms.each_pair do |key, val|
|
24
|
-
method = key.to_s+'='
|
25
|
-
if config.respond_to? method
|
26
|
-
config.send method, val
|
27
|
-
#puts "Debug: #{key} = #{config.send key}" if config.respond_to? key.to_sym
|
28
|
-
else
|
29
|
-
puts "Warning: Option:#{key} class=#{key.class} with value:#{val} is invalid and being ignored"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
if Java::org.hornetq.core.journal.impl.AIOSequentialFileFactory.isSupported
|
34
|
-
config.journal_type = Java::org.hornetq.core.server.JournalType::ASYNCIO
|
35
|
-
else
|
36
|
-
puts("AIO wasn't located on this platform, it will fall back to using pure Java NIO. If your platform is Linux, install LibAIO to enable the AIO journal");
|
37
|
-
config.journal_type = Java::org.hornetq.core.server.JournalType::NIO
|
38
|
-
end
|
39
|
-
|
40
23
|
if uri.host == 'invm'
|
41
24
|
acceptor = Java::org.hornetq.api.core.TransportConfiguration.new(HornetQ::INVM_ACCEPTOR_CLASS_NAME)
|
25
|
+
config.persistence_enabled = false
|
26
|
+
config.security_enabled = false
|
42
27
|
else
|
43
28
|
acceptor = Java::org.hornetq.api.core.TransportConfiguration.new(HornetQ::NETTY_ACCEPTOR_CLASS_NAME, {'host' => uri.host, 'port' => uri.port })
|
44
29
|
connector = Java::org.hornetq.api.core.TransportConfiguration.new(HornetQ::NETTY_CONNECTOR_CLASS_NAME, {'host' => uri.host, 'port' => uri.port })
|
@@ -50,6 +35,12 @@ module HornetQ::Server
|
|
50
35
|
acceptor_conf_set.add(acceptor)
|
51
36
|
config.acceptor_configurations = acceptor_conf_set
|
52
37
|
|
38
|
+
if Java::org.hornetq.core.journal.impl.AIOSequentialFileFactory.isSupported
|
39
|
+
config.journal_type = Java::org.hornetq.core.server.JournalType::ASYNCIO
|
40
|
+
else
|
41
|
+
puts("AIO wasn't located on this platform, it will fall back to using pure Java NIO. If your platform is Linux, install LibAIO to enable the AIO journal");
|
42
|
+
config.journal_type = Java::org.hornetq.core.server.JournalType::NIO
|
43
|
+
end
|
53
44
|
|
54
45
|
if parms[:backup]
|
55
46
|
puts "backup"
|
@@ -67,6 +58,16 @@ module HornetQ::Server
|
|
67
58
|
puts 'standalone'
|
68
59
|
end
|
69
60
|
|
61
|
+
parms.each_pair do |key, val|
|
62
|
+
method = key.to_s+'='
|
63
|
+
if config.respond_to? method
|
64
|
+
config.send method, val
|
65
|
+
#puts "Debug: #{key} = #{config.send key}" if config.respond_to? key.to_sym
|
66
|
+
else
|
67
|
+
puts "Warning: Option:#{key} class=#{key.class} with value:#{val} is invalid and being ignored"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
70
71
|
return Java::org.hornetq.core.server.HornetQServers.newHornetQServer(config)
|
71
72
|
end
|
72
73
|
|
data/test/server_factory_test.rb
CHANGED
@@ -45,20 +45,20 @@ class ServerFactoryTest < Test::Unit::TestCase
|
|
45
45
|
}
|
46
46
|
|
47
47
|
# Create a HornetQ session
|
48
|
-
HornetQ::Client::Factory.
|
48
|
+
HornetQ::Client::Factory.session(config) do |session|
|
49
49
|
session.create_queue(queue_name, queue_name, true)
|
50
50
|
producer = session.create_producer(queue_name)
|
51
51
|
(1..count).each do |i|
|
52
52
|
message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
|
53
53
|
message.durable = true
|
54
54
|
# Set the message body text
|
55
|
-
message
|
55
|
+
message.body = "Message ##{i}"
|
56
56
|
# Send message to the queue
|
57
57
|
producer.send(message)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
HornetQ::Client::Factory.
|
61
|
+
HornetQ::Client::Factory.session(config) do |session|
|
62
62
|
consumer = session.create_consumer(queue_name)
|
63
63
|
session.start
|
64
64
|
|
@@ -124,14 +124,13 @@ class ServerFactoryTest < Test::Unit::TestCase
|
|
124
124
|
|
125
125
|
@producer_thread = MyThread.new('producer') do
|
126
126
|
# Create a HornetQ session
|
127
|
-
HornetQ::Client::Factory.
|
127
|
+
HornetQ::Client::Factory.session(@config) do |session|
|
128
128
|
session.create_queue(@queue_name, @queue_name, true)
|
129
129
|
producer = session.create_producer(@queue_name)
|
130
130
|
(1..@count).each do |i|
|
131
|
-
message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,
|
132
|
-
message.durable = true
|
131
|
+
message = session.create_message(HornetQ::Client::Message::TEXT_TYPE, true)
|
133
132
|
# Set the message body text
|
134
|
-
message
|
133
|
+
message.body = "Message ##{i}"
|
135
134
|
# Send message to the queue
|
136
135
|
begin
|
137
136
|
puts "Producing message: #{message.body}"
|
@@ -163,7 +162,7 @@ class ServerFactoryTest < Test::Unit::TestCase
|
|
163
162
|
should 'failover to backup server w/o message loss' do
|
164
163
|
# Let the producer create the queue
|
165
164
|
sleep 2
|
166
|
-
HornetQ::Client::Factory.
|
165
|
+
HornetQ::Client::Factory.session(@config) do |session|
|
167
166
|
consumer = session.create_consumer(@queue_name)
|
168
167
|
session.start
|
169
168
|
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jruby-hornetq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 2
|
8
|
-
- 1
|
9
|
-
- alpha
|
10
|
-
version: 0.2.1.alpha
|
4
|
+
prerelease: 6
|
5
|
+
version: 0.2.3.alpha
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Reid Morrison
|
@@ -16,20 +11,17 @@ autorequire:
|
|
16
11
|
bindir: bin
|
17
12
|
cert_chain: []
|
18
13
|
|
19
|
-
date: 2011-01-
|
14
|
+
date: 2011-01-27 00:00:00 -05:00
|
20
15
|
default_executable:
|
21
16
|
dependencies:
|
22
17
|
- !ruby/object:Gem::Dependency
|
23
18
|
name: gene_pool
|
24
19
|
prerelease: false
|
25
20
|
requirement: &id001 !ruby/object:Gem::Requirement
|
21
|
+
none: false
|
26
22
|
requirements:
|
27
23
|
- - ~>
|
28
24
|
- !ruby/object:Gem::Version
|
29
|
-
segments:
|
30
|
-
- 1
|
31
|
-
- 1
|
32
|
-
- 1
|
33
25
|
version: 1.1.1
|
34
26
|
type: :runtime
|
35
27
|
version_requirements: *id001
|
@@ -49,12 +41,17 @@ files:
|
|
49
41
|
- Rakefile
|
50
42
|
- README.md
|
51
43
|
- bin/hornetq_server
|
44
|
+
- examples/advanced/transaction-failover/consumer.rb
|
45
|
+
- examples/advanced/transaction-failover/hornetq.yml
|
46
|
+
- examples/advanced/transaction-failover/producer.rb
|
47
|
+
- examples/advanced/transaction-failover/README
|
52
48
|
- examples/client/client.rb
|
53
49
|
- examples/client/consumer.rb
|
54
50
|
- examples/client/invm.rb
|
55
51
|
- examples/client/producer.rb
|
56
52
|
- examples/client/server.rb
|
57
53
|
- examples/client/advanced/batch_client.rb
|
54
|
+
- examples/client/advanced/bytes_producer.rb
|
58
55
|
- examples/client/advanced/client.rb
|
59
56
|
- examples/client/advanced/consumer.rb
|
60
57
|
- examples/client/advanced/hornetq.yml
|
@@ -62,6 +59,10 @@ files:
|
|
62
59
|
- examples/client/advanced/multi_consumer.rb
|
63
60
|
- examples/client/advanced/producer.rb
|
64
61
|
- examples/client/advanced/server.rb
|
62
|
+
- examples/client/data/bindings/hornetq-bindings-1.bindings
|
63
|
+
- examples/client/data/bindings/hornetq-bindings-2.bindings
|
64
|
+
- examples/client/data/journal/hornetq-data-1.hq
|
65
|
+
- examples/client/data/journal/hornetq-data-2.hq
|
65
66
|
- examples/server/backup_server.yml
|
66
67
|
- examples/server/live_server.yml
|
67
68
|
- examples/server/standalone_server.yml
|
@@ -96,25 +97,21 @@ rdoc_options: []
|
|
96
97
|
require_paths:
|
97
98
|
- lib
|
98
99
|
required_ruby_version: !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
99
101
|
requirements:
|
100
102
|
- - ">="
|
101
103
|
- !ruby/object:Gem::Version
|
102
|
-
segments:
|
103
|
-
- 0
|
104
104
|
version: "0"
|
105
105
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
106
107
|
requirements:
|
107
108
|
- - ">"
|
108
109
|
- !ruby/object:Gem::Version
|
109
|
-
segments:
|
110
|
-
- 1
|
111
|
-
- 3
|
112
|
-
- 1
|
113
110
|
version: 1.3.1
|
114
111
|
requirements: []
|
115
112
|
|
116
113
|
rubyforge_project:
|
117
|
-
rubygems_version: 1.
|
114
|
+
rubygems_version: 1.4.2
|
118
115
|
signing_key:
|
119
116
|
specification_version: 3
|
120
117
|
summary: JRuby interface into HornetQ
|