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
@@ -15,7 +15,7 @@ module HornetQ::Client
15
15
  # end
16
16
  #
17
17
  # Parameters:
18
- # see regular session parameters from: HornetQ::Client::Factory::create_session
18
+ # see regular session parameters from: HornetQ::Client::Connection::create_session
19
19
  #
20
20
  # Additional parameters for controlling the session pool itself
21
21
  # :pool_name Name of the pool as it shows up in the logger.
@@ -30,12 +30,12 @@ module HornetQ::Client
30
30
  # For example: Rails.logger
31
31
  # Default: None.
32
32
  # Example:
33
- # session_pool = factory.create_session_pool(config)
33
+ # session_pool = connection.create_session_pool(config)
34
34
  # session_pool.session do |session|
35
35
  # ....
36
36
  # end
37
37
  class SessionPool
38
- def initialize(factory, params={})
38
+ def initialize(connection, params={})
39
39
  # Save Session params since it will be used every time a new session is
40
40
  # created in the pool
41
41
  session_params = params.nil? ? {} : params.dup
@@ -46,7 +46,7 @@ module HornetQ::Client
46
46
  :pool_size => session_params[:pool_size] || 10,
47
47
  :warn_timeout => session_params[:pool_warn_timeout] || 5,
48
48
  :logger => session_params[:pool_logger]) do
49
- s = factory.create_session(session_params)
49
+ s = connection.create_session(session_params)
50
50
  # Start the session since it will be used immediately upon creation
51
51
  s.start
52
52
  s
@@ -4,9 +4,9 @@ module HornetQ
4
4
  #
5
5
  private
6
6
 
7
- # HornetQ requires a factory from which it can create a logger per thread and/or class
7
+ # HornetQ requires a connection from which it can create a logger per thread and/or class
8
8
  class LogDelegateFactory
9
- include
9
+ include Java::org.hornetq.spi.core.logging::LogDelegateFactory
10
10
 
11
11
  def createDelegate(klass)
12
12
  LogDelegate.new(klass.name)
@@ -24,23 +24,25 @@ module HornetQ
24
24
 
25
25
  # DRY, generate a method for each required log level
26
26
  ['debug', 'error', 'fatal', 'info', 'trace', 'warn'].each do |level|
27
- eval <<-LOG_LEVEL_METHOD
28
- def #{level}(message)
29
- @logger.#{level}("[\#{@class_name}] \#{message}") if is#{level.capitalize}Enabled
30
- end
31
-
32
- def #{level}(message, t)
33
- if is#{level.capitalize}Enabled
34
- @logger.#{level}("[\#{@class_name}] \#{message}. \#{t.to_string}")
35
- @logger.#{level}(t.stack_trace.to_string)
27
+ eval <<LOG_LEVEL_METHOD
28
+ def #{level}(message, t=nil)
29
+ logger = HornetQ::logger
30
+ if logger.#{level}?
31
+ if t
32
+ logger.#{level}("[\#{@class_name}] \#{message}. \#{t.toString}")
33
+ logger.#{level}(t.stack_trace.toString)
34
+ else
35
+ logger.#{level}{"[\#{@class_name}] \#{message}"}
36
36
  end
37
37
  end
38
+ end
38
39
 
39
- def is#{level.capitalize}Enabled
40
- @logger.#{level}?
41
- end
42
- LOG_LEVEL_METHOD
40
+ def is#{level.capitalize}Enabled
41
+ HornetQ::logger.#{level}?
43
42
  end
44
43
 
44
+ LOG_LEVEL_METHOD
45
+ end
46
+
45
47
  end
46
48
  end
@@ -2,7 +2,7 @@
2
2
  module HornetQ
3
3
  # Returns the logger being used by both HornetQ and jruby-hornetq
4
4
  def self.logger
5
- @logger ||= (rails_logger || default_logger)
5
+ @logger ||= (self.rails_logger || self.default_logger)
6
6
  end
7
7
 
8
8
  # Replace the logger for both HornetQ and jruby-hornetq
@@ -10,10 +10,26 @@ module HornetQ
10
10
  def self.logger=(logger)
11
11
  @logger = logger
12
12
  # Also replace the HornetQ logger
13
- Java::org.hornetq.core.logging::Logger.setDelegateFactory(HornetQ::LogDelegateFactory.new)
13
+ if @logger
14
+ Java::org.hornetq.core.logging::Logger.setDelegateFactory(HornetQ::LogDelegateFactory.new)
15
+ else
16
+ Java::org.hornetq.core.logging::Logger.reset
17
+ end
14
18
  # TODO org.hornetq.core.logging.Logger.setDelegateFactory(org.hornetq.integration.logging.Log4jLogDelegateFactory.new)
15
19
  end
16
20
 
21
+ # Use the ruby logger, but add needed trace level logging which will result
22
+ # in debug log entries
23
+ def self.ruby_logger(level=nil, target=STDOUT)
24
+ require 'logger'
25
+
26
+ l = ::Logger.new(target)
27
+ l.instance_eval "alias :trace :debug"
28
+ l.instance_eval "alias :trace? :debug?"
29
+ l.level = level || ::Logger::INFO
30
+ l
31
+ end
32
+
17
33
  private
18
34
  def self.rails_logger
19
35
  (defined?(Rails) && Rails.respond_to?(:logger) && Rails.logger) ||
@@ -22,11 +38,8 @@ module HornetQ
22
38
 
23
39
  # By default we use the HornetQ Logger
24
40
  def self.default_logger
41
+ # Needs an actual Java class, so give it: org.hornetq.api.core.client::HornetQClient
25
42
  Java::org.hornetq.core.logging::Logger.getLogger(org.hornetq.api.core.client::HornetQClient)
26
- # require 'logger'
27
- # l = Logger.new(STDOUT)
28
- # l.level = Logger::INFO
29
- # l
30
43
  end
31
-
44
+
32
45
  end
@@ -1,9 +1,9 @@
1
1
  # Extend HornetQ Logger class to respond to standard Rails/Ruby log methods
2
- #
2
+ #
3
3
  # The following methods are already implemented by the java class
4
4
  # initialize
5
5
  # delegate
6
- #
6
+ #
7
7
  # The following methods are being replaced so that they can support blocks
8
8
  # trace
9
9
  # debug
@@ -11,7 +11,7 @@
11
11
  # warn
12
12
  # error
13
13
  # fatal
14
- #
14
+ #
15
15
  # The following methods are new
16
16
  # trace?
17
17
  # debug?
@@ -19,7 +19,7 @@
19
19
  # warn?
20
20
  # error?
21
21
  # fatal?
22
- #
22
+ #
23
23
 
24
24
  # This has to be a "mix-in" because the class can return instances of itself
25
25
  class org.hornetq.core.logging::Logger
@@ -29,21 +29,23 @@ class org.hornetq.core.logging::Logger
29
29
  def #{level}?
30
30
  #{level}_enabled?
31
31
  end
32
-
33
- # Support logging with block parameters that only get evaluated if the
32
+
33
+ alias :java_#{level} :#{level}
34
+
35
+ # Support logging with block parameters that only get evaluated if the
34
36
  # matching log level is enabled
35
37
  def #{level}(message=nil, &block)
36
38
  if #{level}?
37
39
  if block
38
- java_send :#{level}, block.call
40
+ java_#{level}(block.call.to_s.to_java_string)
39
41
  else
40
- java_send :#{level}, message
42
+ java_#{level}(message.to_s.to_java_string)
41
43
  end
42
44
  end
43
45
  end
44
46
  LOG_LEVEL_METHOD
45
47
  end
46
-
48
+
47
49
  private
48
50
  # Implement since not implemented by Logger
49
51
  def error_enabled?
@@ -4,9 +4,92 @@ module HornetQ
4
4
  def self.load_requirements
5
5
  HornetQ.require_jar 'hornetq-core'
6
6
  HornetQ.require_jar 'netty'
7
- require 'hornetq/org_hornetq_core_server_hornet_q_server'
7
+ require 'hornetq/server/org_hornetq_core_server_hornet_q_server'
8
+ end
9
+
10
+ def self.create_server(params={})
11
+ self.load_requirements
12
+
13
+ if params.kind_of?(String)
14
+ uri = HornetQ::URI.new(params)
15
+ params = uri.params
16
+ else
17
+ raise "Missing :uri param in HornetQ::Server.create_server" unless params[:uri]
18
+ uri = HornetQ::URI.new(params.delete(:uri))
19
+ # params override uri params
20
+ params = uri.params.merge(params)
21
+ end
22
+ config = Java::org.hornetq.core.config.impl.ConfigurationImpl.new
23
+ data_directory = params.delete(:data_directory) || HornetQ::DEFAULT_DATA_DIRECTORY
24
+ config.paging_directory = "#{data_directory}/paging"
25
+ config.bindings_directory = "#{data_directory}/bindings"
26
+ config.journal_directory = "#{data_directory}/journal"
27
+ config.large_messages_directory = "#{data_directory}/large-messages"
28
+
29
+ if uri.host == 'invm'
30
+ acceptor = Java::org.hornetq.api.core.TransportConfiguration.new(HornetQ::INVM_ACCEPTOR_CLASS_NAME)
31
+ config.persistence_enabled = false
32
+ config.security_enabled = false
33
+ else
34
+ acceptor = Java::org.hornetq.api.core.TransportConfiguration.new(HornetQ::NETTY_ACCEPTOR_CLASS_NAME, {'host' => uri.host, 'port' => uri.port })
35
+ connector = Java::org.hornetq.api.core.TransportConfiguration.new(HornetQ::NETTY_CONNECTOR_CLASS_NAME, {'host' => uri.host, 'port' => uri.port })
36
+ connector_conf_map = java.util.HashMap.new
37
+ connector_conf_map.put('netty-connector', connector)
38
+ config.connector_configurations = connector_conf_map
39
+ end
40
+ acceptor_conf_set = java.util.HashSet.new
41
+ acceptor_conf_set.add(acceptor)
42
+ config.acceptor_configurations = acceptor_conf_set
43
+
44
+ if Java::org.hornetq.core.journal.impl.AIOSequentialFileFactory.isSupported
45
+ config.journal_type = Java::org.hornetq.core.server.JournalType::ASYNCIO
46
+ else
47
+ require 'rbconfig'
48
+ if Config::CONFIG['target_os'] == 'linux'
49
+ HornetQ.logger("AIO wasn't located on this platform, it will fall back to using pure Java NIO. Install LibAIO to enable the AIO journal")
50
+ end
51
+ config.journal_type = Java::org.hornetq.core.server.JournalType::NIO
52
+ end
53
+
54
+ if params[:backup]
55
+ HornetQ.logger.info "Creating backup server"
56
+ config.backup = true
57
+ config.shared_store = false
58
+ elsif uri.backup_host
59
+ HornetQ.logger.info "Creating live server"
60
+ #backup_params.put('reconnectAttempts', -1)
61
+ backup_connector = Java::org.hornetq.api.core.TransportConfiguration.new(HornetQ::NETTY_CONNECTOR_CLASS_NAME, {'host' => uri.backup_host, 'port' => uri.backup_port })
62
+ connector_conf_map.put('backup-connector', backup_connector)
63
+ config.backup_connector_name = 'backup-connector'
64
+ elsif uri.host == 'invm'
65
+ HornetQ.logger.info 'Creating invm server'
66
+ else
67
+ HornetQ.logger.info 'Creating standalone server'
68
+ end
69
+
70
+ params.each_pair do |key, val|
71
+ method = key.to_s+'='
72
+ if config.respond_to? method
73
+ config.send method, val
74
+ #HornetQ.logger.debug "#{key} = #{config.send key}" if config.respond_to? key.to_sym
75
+ else
76
+ HornetQ.logger.warn "Option:#{key} class=#{key.class} with value:#{val} is invalid and being ignored"
77
+ end
78
+ end
79
+
80
+ return Java::org.hornetq.core.server.HornetQServers.newHornetQServer(config)
81
+ end
82
+
83
+ # Start a new server instance and stop it once the supplied block completes
84
+ def self.start(params={}, &block)
85
+ server = nil
86
+ begin
87
+ server = self.create_server(params)
88
+ server.start
89
+ block.call(server)
90
+ ensure
91
+ server.stop if server
92
+ end
8
93
  end
9
94
  end
10
95
  end
11
-
12
- require 'hornetq/server/factory'
@@ -5,7 +5,7 @@ module Java::org.hornetq.core.server::HornetQServer
5
5
  def enable_shutdown_on_signal
6
6
  ['HUP', 'INT', 'TERM'].each do |signal_name|
7
7
  Signal.trap(signal_name) do
8
- puts "caught #{signal_name}"
8
+ HornetQ.logger.info "Caught #{signal_name}, stopping server"
9
9
  stop
10
10
  end
11
11
  end
data/lib/hornetq/uri.rb CHANGED
@@ -55,5 +55,9 @@ module HornetQ
55
55
  def [](key)
56
56
  @params[key]
57
57
  end
58
+
59
+ def backup?
60
+ !!@params[:backup]
61
+ end
58
62
  end
59
63
  end
@@ -0,0 +1,158 @@
1
+ # Allow examples to be run in-place without requiring a gem install
2
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
+
4
+ require 'rubygems'
5
+ require 'test/unit'
6
+ require 'shoulda'
7
+ require 'hornetq'
8
+ require 'yaml'
9
+
10
+ class ClientConnectionTest < Test::Unit::TestCase
11
+ context 'Client Connection' do
12
+
13
+ setup do
14
+ # This test requires a hornetq running local on the default port
15
+ @config = 'hornetq://localhost'
16
+ end
17
+
18
+ should 'Create Connection to the Server' do
19
+ connection = HornetQ::Client::Connection.new(@config)
20
+ #HornetQ::logger.info connection.to_s
21
+ assert_not_nil connection
22
+ connection.close
23
+ end
24
+
25
+ should 'Create and start Connection to the Server with block' do
26
+ HornetQ::Client::Connection.connection(@config) do |connection|
27
+ assert_not_nil connection
28
+ end
29
+ end
30
+
31
+ should 'Create and start Connection to the Server with block and start one session' do
32
+ HornetQ::Client::Connection.session(@config) do |session|
33
+ assert_not_nil session
34
+ end
35
+ end
36
+
37
+ should 'Start and stop connection' do
38
+ # Connection is started when created
39
+ connection = HornetQ::Client::Connection.new(@config)
40
+ assert_not_nil connection
41
+ assert_nil connection.close
42
+ end
43
+
44
+ should 'Create a session from the connection' do
45
+ connection = HornetQ::Client::Connection.new(@config)
46
+ session = connection.create_session
47
+ assert_not_nil session
48
+
49
+ assert_nil session.start
50
+
51
+ assert_equal session.auto_commit_acks?, true
52
+ assert_equal session.auto_commit_sends?, true
53
+ assert_equal session.block_on_acknowledge?, false
54
+ assert_equal session.closed?, false
55
+ assert_equal session.rollback_only?, false
56
+ assert_equal session.xa?, false
57
+
58
+ assert_nil session.stop
59
+
60
+ # Close the session
61
+ assert_nil session.close
62
+ assert_equal session.closed?, true
63
+
64
+ assert_nil connection.close
65
+ end
66
+
67
+ should 'Create a session with a block' do
68
+ connection = HornetQ::Client::Connection.new(@config)
69
+
70
+ connection.session do |session|
71
+ assert_not_nil session
72
+ assert_equal session.auto_commit_acks?, true
73
+ assert_equal session.auto_commit_sends?, true
74
+ assert_equal session.block_on_acknowledge?, false
75
+ assert_equal session.rollback_only?, false
76
+
77
+ assert_equal session.xa?, false
78
+ assert_equal session.closed?, false
79
+ end
80
+
81
+ assert_nil connection.close
82
+ end
83
+
84
+ should 'create a session without a block and throw exception' do
85
+ connection = HornetQ::Client::Connection.new(@config)
86
+
87
+ assert_raise(RuntimeError) { connection.session }
88
+
89
+ assert_nil connection.close
90
+ end
91
+
92
+ # should 'Create a session from the connection with params' do
93
+ # connection = HornetQ::Client::Connection.new(@config)
94
+ #
95
+ # session_parms = {
96
+ # :transacted => true,
97
+ # :options => javax.jms.Session::AUTO_ACKNOWLEDGE
98
+ # }
99
+ #
100
+ # session = connection.create_session(session_parms)
101
+ # assert_not_nil session
102
+ # assert_equal session.transacted?, true
103
+ # # When session is transacted, options are ignore, so ack mode must be transacted
104
+ # assert_equal session.acknowledge_mode, javax.jms.Session::SESSION_TRANSACTED
105
+ # assert_nil session.close
106
+ #
107
+ # assert_nil connection.stop
108
+ # assert_nil connection.close
109
+ # end
110
+ #
111
+ # should 'Create a session from the connection with block and params' do
112
+ # HornetQ::Client::Connection.start_session(@config) do |connection|
113
+ #
114
+ # session_parms = {
115
+ # :transacted => true,
116
+ # :options => javax.jms.Session::CLIENT_ACKNOWLEDGE
117
+ # }
118
+ #
119
+ # connection.session(session_parms) do |session|
120
+ # assert_not_nil session
121
+ # assert_equal session.transacted?, true
122
+ # # When session is transacted, options are ignore, so ack mode must be transacted
123
+ # assert_equal session.acknowledge_mode, javax.jms.Session::SESSION_TRANSACTED
124
+ # end
125
+ # end
126
+ # end
127
+ #
128
+ # should 'Create a session from the connection with block and params opposite test' do
129
+ # HornetQ::Client::Connection.start_session(@config) do |connection|
130
+ #
131
+ # session_parms = {
132
+ # :transacted => false,
133
+ # :options => javax.jms.Session::AUTO_ACKNOWLEDGE
134
+ # }
135
+ #
136
+ # connection.session(session_parms) do |session|
137
+ # assert_not_nil session
138
+ # assert_equal session.transacted?, false
139
+ # assert_equal session.acknowledge_mode, javax.jms.Session::AUTO_ACKNOWLEDGE
140
+ # end
141
+ # end
142
+ # end
143
+ #
144
+ # context 'HornetQ::Client Connection additional capabilities' do
145
+ #
146
+ # should 'start an on_message handler' do
147
+ # HornetQ::Client::Connection.start_session(@config) do |connection|
148
+ # value = nil
149
+ # connection.on_message(:transacted => true, :queue_name => :temporary) do |message|
150
+ # value = "received"
151
+ # end
152
+ # end
153
+ # end
154
+ #
155
+ # end
156
+
157
+ end
158
+ end