jruby-hornetq 0.2.5.alpha → 0.3.0.alpha

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