jruby-hornetq 0.2.5.alpha → 0.3.0.alpha

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.
Files changed (77) hide show
  1. data/HISTORY.md +12 -0
  2. data/Rakefile +13 -1
  3. data/bin/hornetq_server +2 -2
  4. data/examples/README +6 -0
  5. data/examples/{client/advanced → advanced}/batch_client.rb +18 -34
  6. data/examples/advanced/bytes_producer.rb +25 -0
  7. data/examples/advanced/client.rb +56 -0
  8. data/examples/{client/advanced/multi_client.rb → advanced/client_session_pooling.rb} +29 -25
  9. data/examples/advanced/consume_on_message.rb +50 -0
  10. data/examples/advanced/consumer.rb +31 -0
  11. data/examples/{client/advanced → advanced}/hornetq.yml +8 -6
  12. data/examples/advanced/multi_client.rb +71 -0
  13. data/examples/advanced/producer.rb +37 -0
  14. data/examples/advanced/server.rb +44 -0
  15. data/examples/client-server/client.rb +40 -0
  16. data/examples/client-server/server.rb +37 -0
  17. data/examples/producer-consumer/consume_all.rb +25 -0
  18. data/examples/producer-consumer/consume_on_message.rb +46 -0
  19. data/examples/producer-consumer/consumer.rb +27 -0
  20. data/examples/producer-consumer/producer.rb +32 -0
  21. data/examples/{client/resque → resque}/hornetq_job.rb +2 -2
  22. data/examples/{client/resque → resque}/processor.rb +1 -1
  23. data/examples/{client/resque → resque}/readme.md +0 -0
  24. data/examples/{client/resque → resque}/resque_conf.rb +0 -0
  25. data/examples/{client/resque → resque}/resque_worker.rb +0 -0
  26. data/examples/{client/resque → resque}/sleep_job.rb +0 -0
  27. data/examples/{server → server-config}/backup_server.yml +0 -0
  28. data/examples/{server → server-config}/live_server.yml +0 -0
  29. data/examples/{server → server-config}/standalone_server.yml +0 -0
  30. data/examples/{client → simple}/invm.rb +6 -7
  31. data/examples/{advanced/transaction-failover → transaction-failover}/README +0 -0
  32. data/examples/{advanced/transaction-failover → transaction-failover}/consumer.rb +4 -1
  33. data/examples/{advanced/transaction-failover → transaction-failover}/hornetq.yml +6 -3
  34. data/examples/{advanced/transaction-failover → transaction-failover}/producer.rb +8 -3
  35. data/examples/{simple_worker → worker}/README +0 -0
  36. data/examples/worker/hornetq.yml +26 -0
  37. data/examples/worker/producer.rb +71 -0
  38. data/examples/{simple_worker → worker}/test_object.rb +0 -0
  39. data/examples/worker/worker.rb +72 -0
  40. data/lib/hornetq/client.rb +1 -1
  41. data/lib/hornetq/client/{factory.rb → connection.rb} +153 -86
  42. data/lib/hornetq/client/message_handler.rb +3 -3
  43. data/lib/hornetq/client/org_hornetq_api_core_client_client_session.rb +187 -26
  44. data/lib/hornetq/client/org_hornetq_core_client_impl_client_consumer_impl.rb +26 -9
  45. data/lib/hornetq/client/org_hornetq_core_client_impl_client_message_impl.rb +190 -35
  46. data/lib/hornetq/client/session_pool.rb +4 -4
  47. data/lib/hornetq/common/log_delegate.rb +17 -15
  48. data/lib/hornetq/common/logging.rb +20 -7
  49. data/lib/hornetq/common/org_hornetq_core_logging_logger.rb +11 -9
  50. data/lib/hornetq/server.rb +86 -3
  51. data/lib/hornetq/{org_hornetq_core_server_hornet_q_server.rb → server/org_hornetq_core_server_hornet_q_server.rb} +1 -1
  52. data/lib/hornetq/uri.rb +4 -0
  53. data/test/client_connection_test.rb +158 -0
  54. data/test/logging_test.rb +32 -0
  55. data/test/server_test.rb +208 -0
  56. metadata +47 -48
  57. data/examples/client/advanced/bytes_producer.rb +0 -21
  58. data/examples/client/advanced/client.rb +0 -47
  59. data/examples/client/advanced/consumer.rb +0 -35
  60. data/examples/client/advanced/multi_consumer.rb +0 -54
  61. data/examples/client/advanced/producer.rb +0 -35
  62. data/examples/client/advanced/server.rb +0 -39
  63. data/examples/client/client.rb +0 -31
  64. data/examples/client/consumer.rb +0 -22
  65. data/examples/client/data/bindings/hornetq-bindings-1.bindings +0 -0
  66. data/examples/client/data/bindings/hornetq-bindings-2.bindings +0 -0
  67. data/examples/client/data/journal/hornetq-data-1.hq +0 -0
  68. data/examples/client/data/journal/hornetq-data-2.hq +0 -0
  69. data/examples/client/producer.rb +0 -21
  70. data/examples/client/server.rb +0 -31
  71. data/examples/simple_worker/hornetq.yml +0 -34
  72. data/examples/simple_worker/producer.rb +0 -54
  73. data/examples/simple_worker/worker.rb +0 -49
  74. data/lib/data/bindings/hornetq-bindings-1.bindings +0 -0
  75. data/lib/data/bindings/hornetq-bindings-2.bindings +0 -0
  76. data/lib/hornetq/server/factory.rb +0 -87
  77. data/test/server_factory_test.rb +0 -183
data/HISTORY.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 0.3.0 (2011-02-16)
2
+
3
+ * Rename HornetQ::Client::Factory to HornetQ::Client::Connection
4
+ * Add Client Tests
5
+ * Fix logging to HornetQ default logger when no other logger supplied
6
+ * Re-arrange Examples
7
+ * Add Worker samples
8
+
9
+ ## 0.2.5 (2011-02-07)
10
+
11
+ * Add Rails and Ruby Logging
12
+
1
13
  ## 0.2.1 (2011-01-26)
2
14
 
3
15
  * Support for InVM Server
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
1
  raise "jruby-hornetq 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-hornetq'
11
- s.version = '0.2.5.alpha'
12
+ s.version = '0.3.0.alpha'
12
13
  s.authors = ['Reid Morrison', 'Brad Pardee']
13
14
  s.email = ['rubywmq@gmail.com', 'bpardee@gmail.com']
14
15
  s.homepage = 'https://github.com/ClarityServices/jruby-hornetq'
@@ -17,7 +18,18 @@ task :gem do |t|
17
18
  s.summary = 'JRuby interface into HornetQ'
18
19
  s.files = FileList["./**/*"].exclude('*.gem', './nbproject/*').map{|f| f.sub(/^\.\//, '')}
19
20
  s.has_rdoc = true
21
+ s.executables = %w(hornetq_server)
20
22
  s.add_dependency "gene_pool", "~> 1.1.1"
21
23
  end
22
24
  Gem::Builder.new(gemspec).build
23
25
  end
26
+
27
+ desc "Run Test Suite"
28
+ task :test do
29
+ Rake::TestTask.new(:functional) do |t|
30
+ t.test_files = FileList['test/*_test.rb']
31
+ t.verbose = true
32
+ end
33
+
34
+ Rake::Task['functional'].invoke
35
+ end
data/bin/hornetq_server CHANGED
@@ -32,10 +32,10 @@ if ARGV[0] =~ /\.ya?ml$/
32
32
  config = config[ARGV[i]] || config[ARGV[i].to_sym]
33
33
  end
34
34
  puts "config=#{config.inspect}"
35
- server = HornetQ::Server::Factory.create_server(config)
35
+ server = HornetQ::Server.create_server(config)
36
36
  else
37
37
  uri = ARGV[0]
38
- server = HornetQ::Server::Factory.create_server(uri)
38
+ server = HornetQ::Server.create_server(uri)
39
39
  end
40
40
  server.enable_shutdown_on_signal
41
41
  server.start
data/examples/README ADDED
@@ -0,0 +1,6 @@
1
+ Most of the examples will run in-place without requiring a gem install. However,
2
+ to start the hornetq_server you must set the following environment variables
3
+ adjusting the value of jruby-hornetq-home as necessary.
4
+
5
+ export RUBYLIB=<jruby-hornetq-home>/lib
6
+ export PATH=<jruby-hornetq-home>/bin:$PATH
@@ -12,7 +12,7 @@
12
12
  # Once 80% of the replies are back, it will send the next batch
13
13
 
14
14
  # Allow examples to be run in-place without requiring a gem install
15
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../../lib'
15
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
16
16
 
17
17
  require 'rubygems'
18
18
  require 'yaml'
@@ -21,25 +21,21 @@ require 'sync'
21
21
 
22
22
  total_count = (ARGV[0] || 100).to_i
23
23
  batching_size = (ARGV[1] || 10).to_i
24
- request_address = 'jms.queue.ExampleQueue'
25
24
 
25
+ request_address = 'ServerAddress'
26
26
  config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
27
27
 
28
28
  class BatchClientPattern
29
- def initialize(session, request_address)
30
- @producer = session.create_producer(request_address)
31
- reply_queue = "#{request_address}.#{Java::java.util::UUID.randomUUID.toString}"
32
- begin
33
- session.create_temporary_queue(reply_queue, reply_queue)
34
- rescue NativeException => exc
35
- p exc
36
- end
37
- @consumer = session.create_consumer(reply_queue)
38
- @session = session
39
- session.start
40
-
29
+ def initialize(connection, request_address)
30
+ @session = connection.create_session
31
+ @producer = @session.create_producer(request_address)
32
+ @reply_queue = "#{request_address}.#{Java::java.util::UUID.randomUUID.toString}"
33
+ @session.create_temporary_queue(@reply_queue, @reply_queue)
41
34
  @counter_sync = Sync.new
42
35
  @counter = 0
36
+
37
+ # Start consuming replies
38
+ connection.on_message(:queue_name => @reply_queue) {|message| process_reply(message) }
43
39
  end
44
40
 
45
41
  # Increment Message Counter
@@ -63,7 +59,7 @@ class BatchClientPattern
63
59
  start_time = Time.now
64
60
  total_count.times do |i|
65
61
  message = @session.create_message(HornetQ::Client::Message::TEXT_TYPE,true)
66
- message.reply_to_queue_name = @consumer.queue_name
62
+ message.reply_to_queue_name = @reply_queue
67
63
  message.body = "Request Current Time. #{i}"
68
64
  @producer.send(message)
69
65
  print "."
@@ -74,35 +70,23 @@ class BatchClientPattern
74
70
  end
75
71
 
76
72
  # Receive Reply messages
77
- def receive
78
- print "Receiving messages"
79
- begin
80
- while reply = @consumer.receive
81
- print '@'
82
- # puts "Received:#{reply}, [#{reply.body}]"
83
- inc_counter(1)
84
- reply.acknowledge
85
- end
86
- rescue Exception => exc
87
- p exc
88
- end
73
+ def process_reply(message)
74
+ print '@'
75
+ inc_counter(1)
76
+ message.acknowledge
89
77
  end
90
78
 
91
79
  def close
92
80
  @producer.close
93
- @consumer.close
94
- @session.delete_queue(@consumer.queue_name)
81
+ @session.close
95
82
  end
96
83
  end
97
84
 
98
85
  # Create a HornetQ session
99
- HornetQ::Client::Factory.session(config) do |session|
86
+ HornetQ::Client::Connection.connection(config[:connection]) do |connection|
100
87
  batching_size = total_count if batching_size > total_count
101
88
 
102
- client = BatchClientPattern.new(session, request_address)
103
-
104
- # Start receive thread
105
- receive_thread = Thread.new {client.receive}
89
+ client = BatchClientPattern.new(connection, request_address)
106
90
 
107
91
  times = (total_count/batching_size).to_i
108
92
  puts "Performing #{times} loops"
@@ -0,0 +1,25 @@
1
+ #
2
+ # HornetQ Producer:
3
+ # Write binary/bytes 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::Connection.session('hornetq://localhost') do |session|
13
+ # Create the non-durable TestQueue to receive messages sent to the TestAddress
14
+ session.create_queue_ignore_exists('TestAddress', 'TestQueue', false)
15
+
16
+ # Create Producer so that we can send messages to the Address 'jms.queue.ExampleQueue'
17
+ session.producer('TestAddress') do |producer|
18
+
19
+ # Create a non-durable bytes message to send
20
+ message = session.create_message(HornetQ::Client::Message::BYTES_TYPE,false)
21
+ message.body = "#{Time.now}: ### Hello, World ###"
22
+
23
+ producer.send(message)
24
+ end
25
+ end
@@ -0,0 +1,56 @@
1
+ #
2
+ # HornetQ Requestor:
3
+ # Submit a request and wait for a reply
4
+ # Uses the Requestor Pattern
5
+ #
6
+ # The Server (server.rb) must be running first, otherwise this example
7
+ # program will eventually timeout
8
+ # Displays a '.' for every request completed
9
+ # Used for performance measurements
10
+ #
11
+
12
+ # Allow examples to be run in-place without requiring a gem install
13
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
14
+
15
+ require 'rubygems'
16
+ require 'yaml'
17
+ require 'hornetq'
18
+
19
+ count = (ARGV[0] || 1).to_i
20
+ timeout = (ARGV[1] || 30000).to_i
21
+
22
+ config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
23
+
24
+ # Create a HornetQ session
25
+ HornetQ::Client::Connection.start_session(config) do |session|
26
+ # Create a non-durable ServerQueue to receive messages sent to the ServerAddress
27
+ session.create_queue_ignore_exists('ServerAddress', 'ServerQueue', false)
28
+ start_time = Time.now
29
+
30
+ # Use Requestor (Client) Pattern to do a "RPC like" call to a server
31
+ # Under the covers the requestor creates a temporary dynamic reply to queue
32
+ # for the server to send the reply message to
33
+ session.requestor('ServerAddress') do |requestor|
34
+ # Create non-durable message
35
+ puts "Sending #{count} requests"
36
+ (1..count).each do |i|
37
+ message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
38
+ message.body = "Some request data"
39
+ # Set the user managed message id
40
+ message.user_id = Java::org.hornetq.utils::UUIDGenerator.getInstance.generateUUID
41
+
42
+ if reply = requestor.request(message, timeout)
43
+ puts "Received Response: #{reply.inspect}" if count < 10
44
+ puts " Message:[#{reply.body.inspect}]" if count < 10
45
+ print "." if count >= 10
46
+ else
47
+ puts "Time out, No reply received after #{timeout/1000} seconds"
48
+ end
49
+ puts "#{i}" if i%1000 == 0
50
+
51
+ end
52
+ end
53
+
54
+ duration = Time.now - start_time
55
+ puts "\nMade #{count} calls in #{duration} seconds at #{count/duration} synchronous requests per second"
56
+ end
@@ -1,21 +1,22 @@
1
1
  #
2
- # HornetQ Requestor:
3
- # Multithreaded clients all doing requests
2
+ # HornetQ Requestor using session_pooling:
3
+ # Multithreaded clients all doing requests.
4
+ #
5
+ # Shows how the same session can be used safely on different threads
6
+ # rather than each thread having to create its own session
7
+ #
4
8
  # Typical scenario is in a Rails app when we need to do a call to a
5
9
  # remote server and block until a response is received
6
10
  #
7
- # Shows how to use the session pool so that not every thread has to have its
8
- # own session
9
- #
10
11
 
11
12
  # Allow examples to be run in-place without requiring a gem install
12
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../../lib'
13
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
13
14
 
14
15
  require 'rubygems'
15
16
  require 'yaml'
16
17
  require 'hornetq'
17
18
 
18
- $thread_count = (ARGV[0] || 1).to_i
19
+ $thread_count = (ARGV[0] || 2).to_i
19
20
  $timeout = (ARGV[1] || 30000).to_i
20
21
 
21
22
  config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
@@ -24,10 +25,10 @@ config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
24
25
  def worker_thread(id, session_pool)
25
26
  begin
26
27
  # Obtain a session from the pool and return when complete
27
- session_pool.requestor('jms.queue.ExampleQueue') do |session, requestor|
28
+ session_pool.requestor('ServerAddress') do |session, requestor|
28
29
  message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
29
30
  message.body = "Request Current Time"
30
-
31
+
31
32
  # Send message to the queue
32
33
  puts "Thread[#{id}]: Sending Request"
33
34
  if reply = requestor.request(message, $timeout)
@@ -44,23 +45,26 @@ def worker_thread(id, session_pool)
44
45
  puts "Thread[#{id}]: Complete"
45
46
  end
46
47
 
47
- # Create a HornetQ Factory
48
- HornetQ::Client::Factory.create_factory(config[:connector]) do |factory|
49
-
48
+ # Create a HornetQ Connection
49
+ HornetQ::Client::Connection.connection(config[:connection]) do |connection|
50
+
50
51
  # Create a pool of session connections, all with the same session parameters
51
52
  # The pool is thread-safe and can be accessed concurrently by multiple threads
52
- session_pool = factory.create_session_pool(config[:session])
53
- threads = []
54
-
55
- # Do some work and then lets re-use the session in another thread below
56
- worker_thread(9999, session_pool)
57
-
58
- $thread_count.times do |i|
59
- # Each thread will get a session from the session pool as needed
60
- threads << Thread.new { worker_thread(i, session_pool) }
53
+ begin
54
+ session_pool = connection.create_session_pool(config[:session])
55
+ threads = []
56
+
57
+ # Do some work and then lets re-use the session in another thread below
58
+ worker_thread(9999, session_pool)
59
+
60
+ $thread_count.times do |i|
61
+ # Each thread will get a session from the session pool as needed
62
+ threads << Thread.new { worker_thread(i, session_pool) }
63
+ end
64
+ threads.each {|t| t.join}
65
+
66
+ # Important. Remember to close any open sessions in the pool
67
+ ensure
68
+ session_pool.close if session_pool
61
69
  end
62
- threads.each {|t| t.join}
63
-
64
- # Important. Remember to close any open sessions in the pool
65
- session_pool.close
66
70
  end
@@ -0,0 +1,50 @@
1
+ #
2
+ # HornetQ Consumer:
3
+ # Use Connection::on_message to consume all messages in separate
4
+ # threads so as not to block the main thread
5
+ # Displays a '.' for every message received
6
+ # Used for performance measurements of consuming messages
7
+ #
8
+
9
+ # Allow examples to be run in-place without requiring a gem install
10
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
11
+
12
+ require 'yaml'
13
+ require 'rubygems'
14
+ require 'hornetq'
15
+
16
+ sleep_time = (ARGV[0] || 60000).to_i
17
+ session_count = (ARGV[1] || 1).to_i
18
+
19
+ config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
20
+
21
+ # Using Connect.start since a session must be started in order to consume messages
22
+ HornetQ::Client::Connection.connection(config[:connection]) do |connection|
23
+
24
+ # Create a non-durable TestQueue to receive messages sent to the TestAddress
25
+ connection.session(config[:session]) do |session|
26
+ session.create_queue_ignore_exists('TestAddress', 'TestQueue', false)
27
+ end
28
+
29
+ # Consume All messages from the queue and gather statistics
30
+ # on_message will call the supplied block for every message received in another
31
+ # thread. As a result, the on_message call returns immediately!
32
+ # Other work can be performed on this thread, or just a sleep as in this example
33
+ #
34
+ # :session_count can be used to spawn multiple consumers simultaneously, each
35
+ # receiving messages simultaneously on their own threads
36
+ connection.on_message(:queue_name => 'TestQueue',
37
+ :session_count => session_count,
38
+ :statistics => true) do |message|
39
+ print '.'
40
+ message.acknowledge
41
+ end
42
+
43
+ puts "Started #{session_count} consumers, will wait for #{sleep_time/1000} seconds before shutting down"
44
+ # Wait for sleep_time before shutting down the server
45
+ sleep(sleep_time/1000)
46
+
47
+ connection.on_message_statistics.each do |stats|
48
+ puts "Received #{stats[:count]} messages in #{stats[:duration]} seconds at #{stats[:messages_per_second]} messages per second"
49
+ end
50
+ end
@@ -0,0 +1,31 @@
1
+ #
2
+ # HornetQ Consumer:
3
+ # Consume all messages from the queue: TestQueue in the current thread
4
+ # Displays a '.' for every message received
5
+ # Used for performance measurements of consuming messages
6
+ #
7
+
8
+ # Allow examples to be run in-place without requiring a gem install
9
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib'
10
+
11
+ require 'rubygems'
12
+ require 'yaml'
13
+ require 'hornetq'
14
+
15
+ timeout = (ARGV[0] || 1000).to_i
16
+
17
+ config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
18
+
19
+ # Create a HornetQ session
20
+ HornetQ::Client::Connection.start_session(config) do |session|
21
+
22
+ # Create the non-durable TestQueue to receive messages sent to the TestAddress
23
+ session.create_queue_ignore_exists('TestAddress', 'TestQueue', false)
24
+
25
+ # Consume All messages from the queue
26
+ stats = session.consume(:queue_name => 'TestQueue', :timeout=> 0, :statistics=>true) do |message|
27
+ print '.'
28
+ message.acknowledge
29
+ end
30
+ puts "Received #{stats[:count]} messages in #{stats[:duration]} seconds at #{stats[:messages_per_second]} messages per second"
31
+ end
@@ -1,10 +1,9 @@
1
1
  ---
2
2
  development:
3
- :connector:
4
- :uri: hornetq://localhost,192.168.0.22
3
+ :connection:
4
+ :uri: hornetq://localhost
5
5
  :failover_on_initial_connection: true
6
6
  :failover_on_server_shutdown: true
7
- # 5 Connection attempts takes about 16 seconds before it switches to the backup server
8
7
  :reconnect_attempts: 5
9
8
  :session:
10
9
  :username: guest
@@ -12,11 +11,14 @@ development:
12
11
 
13
12
  # Example configuration showing all possible options and their default values if available
14
13
  full_example:
15
- :connector:
14
+ :connection:
16
15
  # The uri is written as follows for the NettyConnectorFactory.
17
- # protocol=netty is the default and therefore not required
18
16
  :uri: hornetq://localhost:5445,backuphost:5445/?protocol=netty
19
- # Or, the uri is written as follows for the InVM
17
+ # protocol=netty is the default and therefore not required
18
+ :uri: hornetq://localhost:5445,backuphost:5445
19
+ # And since the default port is 5445
20
+ :uri: hornetq://localhost,backuphost
21
+ # Or, the uri is written as follows for InVM
20
22
  :uri: hornetq://invm
21
23
  # Or, the uri is written as follows for auto-discovery
22
24
  :uri: hornetq://discoveryhost:5445/?protocol=discovery