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
@@ -12,10 +12,10 @@ module HornetQ::Client
12
12
  # or when Consumer::on_message_statistics is called. In this case on_message_statistics::statistics
13
13
  # can be called several times during processing without affecting the end time.
14
14
  # The start time and message count is never reset for this instance
15
- def initialize(parms={}, &proc)
15
+ def initialize(params={}, &proc)
16
16
  @proc = proc
17
17
 
18
- if parms[:statistics]
18
+ if params[:statistics]
19
19
  @message_count = 0
20
20
  @start_time = Time.now
21
21
  end
@@ -54,7 +54,7 @@ module HornetQ::Client
54
54
  raise "First call Consumer::on_message with :statistics=>true before calling MessageConsumer::statistics()" unless @message_count
55
55
  duration =(@last_time || Time.now) - @start_time
56
56
  {
57
- :messages => @message_count,
57
+ :count => @message_count,
58
58
  :duration => duration,
59
59
  :messages_per_second => (@message_count/duration).to_i
60
60
  }
@@ -1,11 +1,94 @@
1
- # Add methods to Session Interface
2
- # For more information on methods, see:
3
- # http://hornetq.sourceforge.net/docs/hornetq-2.1.0.Final/api/index.html?org/hornetq/api/core/client/ClientSession.html
1
+ # For each thread that will be processing messages concurrently a separate
2
+ # session is required.
3
+ #
4
+ # Interface org.hornetq.api.core.client.ClientSession
5
+ #
6
+ # See: http://hornetq.sourceforge.net/docs/hornetq-2.1.0.Final/api/index.html?org/hornetq/api/core/client/ClientSession.html
7
+ #
8
+ # Other methods still directly accessible through this class:
9
+ #
10
+ # add_failure_listener(SessionFailureListener listener)
11
+ # Adds a FailureListener to the session which is notified if a failure occurs on the session
12
+ #
13
+ # binding_query(SimpleString address)
14
+ # Queries information on a binding
15
+ #
16
+ # close()
17
+ # Closes this session
18
+ #
19
+ # commit()
20
+ # Commits the current transaction
21
+ #
22
+ # ClientMessage create_message(boolean durable)
23
+ # Creates a ClientMessage.
24
+ # ClientMessage create_message(byte type, boolean durable)
25
+ # Creates a ClientMessage.
26
+ # ClientMessage create_message(byte type, boolean durable, long expiration, long timestamp, byte priority)
27
+ # Creates a ClientMessage.
28
+ #
29
+ # ClientProducer create_producer()
30
+ # Creates a producer with no default address.
31
+ # ClientProducer create_producer(SimpleString address)
32
+ # Creates a producer which sends messages to the given address
33
+ # ClientProducer create_producer(SimpleString address, int rate)
34
+ # Creates a producer which sends messages to the given address
35
+ # ClientProducer create_producer(String address)
36
+ # Creates a producer which sends messages to the given address
37
+ #
38
+ # void create_queue(String address, String queueName)
39
+ # Creates a non-temporary queue non-durable queue.
40
+ # void create_queue(String address, String queueName, boolean durable)
41
+ # Creates a non-temporary queue.
42
+ # void create_queue(String address, String queueName, String filter, boolean durable)
43
+ # Creates a non-temporaryqueue.
44
+ #
45
+ # void create_temporary_queue(String address, String queueName)
46
+ # Creates a temporary queue.
47
+ # void create_temporary_queue(String address, String queueName, String filter)
48
+ # Creates a temporary queue with a filter.
49
+ #
50
+ # void delete_queue(String queueName)
51
+ # Deletes the queue.
52
+ # int version()
53
+ # Returns the server's incrementingVersion.
54
+ #
55
+ # XAResource xa_resource()
56
+ # Returns the XAResource associated to the session.
57
+ #
58
+ # auto_commit_acks?
59
+ # Returns whether the session will automatically commit its transaction every time a message is acknowledged by a ClientConsumer created by this session, false else
60
+ # auto_commit_sends?
61
+ # Returns whether the session will automatically commit its transaction every time a message is sent by a ClientProducer created by this session, false else
62
+ # block_on_acknowledge?
63
+ # Returns whether the ClientConsumer created by the session will block when they acknowledge a message
64
+ # closed?
65
+ # Returns whether the session is closed or not.
66
+ # rollback_only?
67
+ # Returns true if the current transaction has been flagged to rollback, false else
68
+ # xa?
69
+ # Return true if the session supports XA, false else
70
+ #
71
+ # ClientSession.QueueQuery queue_query(SimpleString queueName)
72
+ # Queries information on a queue
73
+ #
74
+ # boolean removeFailureListener(SessionFailureListener listener)
75
+ # Removes a FailureListener to the session
76
+ #
77
+ # void rollback()
78
+ # Rolls back the current transaction
79
+ # void rollback(boolean considerLastMessageAsDelivered)
80
+ # Rolls back the current transaction
81
+ #
82
+ # void set_send_acknowledgement_handler(SendAcknowledgementHandler handler)
83
+ # Sets a SendAcknowledgementHandler for this session
84
+ #
85
+ # void start()
86
+ # Starts the session
87
+ # void stop()
88
+ # Stops the session
89
+
4
90
  module Java::org.hornetq.api.core.client::ClientSession
5
91
 
6
- # Document Methods from Java Docs:
7
- # create_queue(address, queue_name, durable?)
8
-
9
92
  # Creates a ClientConsumer to consume or browse messages matching the filter
10
93
  # from the queue with the given name, calls the supplied block, then close the
11
94
  # consumer
@@ -34,12 +117,13 @@ module Java::org.hornetq.api.core.client::ClientSession
34
117
  #
35
118
  # Example
36
119
  # # Just browse the messages without consuming them
37
- # session.consumer(:queue_name => 'my_queue', :browse_only => true) do |consumer|
120
+ # session.consumer(:queue_name => ##'my_queue', :browse_only => true) do |consumer|
38
121
  # msg = consumer.receive_immediate
39
122
  # p msg
40
123
  # msg.acknowledge
41
124
  # end
42
125
  def consumer(params={}, &block)
126
+ raise "Missing mandatory code block" unless block
43
127
  consumer = nil
44
128
  begin
45
129
  consumer = create_consumer_from_params(params)
@@ -49,23 +133,101 @@ module Java::org.hornetq.api.core.client::ClientSession
49
133
  end
50
134
  end
51
135
 
52
- # Deprecated
136
+ # Consume or browse all messages matching the filter from the queue with the
137
+ # given name, calls the supplied block for every message received from the
138
+ # queue. Once the timeout has been reached it closes the consumer
139
+ #
140
+ # Parameters:
141
+ # :timeout How to timeout waiting for messages
142
+ # -1 : Wait forever
143
+ # 0 : Return immediately if no message is available (default)
144
+ # x : Wait for x milli-seconds for a message to be received from the server
145
+ # Note: Messages may still be on the queue, but the server has not supplied any messages
146
+ # in the time interval specified
147
+ # Default: 0
148
+ # :queue_name => The name of the queue to consume messages from. Mandatory
149
+ # :filter => Only consume messages matching the filter: Default: nil
150
+ # :browse_only => Whether to just browse the queue or consume messages
151
+ # true | false. Default: false
152
+ # :window_size => The consumer window size.
153
+ # :max_rate => The maximum rate to consume messages.
154
+ #
155
+ # :statistics Capture statistics on how many messages have been read
156
+ # true : This method will capture statistics on the number of messages received
157
+ # and the time it took to process them.
158
+ # Statistics are cumulative between calls to ::each and will only be
159
+ # reset when ::each is called again with :statistics => true
160
+ #
161
+ # Note: If either :window_size or :max_rate is supplied, then BOTH are required
162
+ #
163
+ # Returns the statistics gathered when :statistics => true, otherwise nil
164
+ #
165
+ # Example
166
+ # session.consume(:queue_name => 'my_queue', :timeout => 1000) do |message|
167
+ # p message
168
+ # message.acknowledge
169
+ # end
170
+ #
171
+ # Example
172
+ # # Just browse the messages without consuming them
173
+ # session.consume(:queue_name => 'my_queue', :timeout => 1000, :browse_only => true) do |message|
174
+ # p message
175
+ # message.acknowledge
176
+ # end
177
+ def consume(params, &block)
178
+ raise "Missing mandatory code block" unless block
179
+ c = self.create_consumer_from_params(params)
180
+ begin
181
+ c.each(params, &block)
182
+ ensure
183
+ c.close
184
+ end
185
+ end
186
+
187
+ # Create a consumer using named parameters. The following Java create_consumer
188
+ # methods are still directly accessible:
189
+ # create_consumer(String queueName)
190
+ # Creates a ClientConsumer to consume messages from the queue with the given name
191
+ # create_consumer(String queueName, boolean browseOnly)
192
+ # Creates a ClientConsumer to consume or browse messages from the queue with the given name.
193
+ # create_consumer(String queueName, String filter)
194
+ # Creates a ClientConsumer to consume messages matching the filter from the queue with the given name.
195
+ # create_consumer(String queueName, String filter, boolean browseOnly)
196
+ # Creates a ClientConsumer to consume or browse messages matching the filter from the queue with the given name.
197
+ # create_consumer(String queueName, String filter, int windowSize, int maxRate, boolean browseOnly)
198
+ # Creates a ClientConsumer to consume or browse messages matching the filter from the queue with the given name.
199
+ #
200
+ # The parameters for creating the consumer are as follows:
201
+ # :queue_name => The name of the queue to consume messages from. Mandatory
202
+ # :filter => Only consume messages matching the filter: Default: nil
203
+ # :browse_only => Whether to just browse the queue or consume messages
204
+ # true | false. Default: false
205
+ # :window_size => The consumer window size.
206
+ # :max_rate => The maximum rate to consume messages.
207
+ #
208
+ # Note: If either :window_size or :max_rate is supplied, then BOTH are required
209
+ #
210
+ # Returns a new Consumer that can be used for consuming messages from
211
+ # the queue
53
212
  def create_consumer_from_params(params={})
54
- queue_name = params.kind_of?(Hash) ? params[:queue_name] : params
55
- raise("Missing mandatory parameter :queue_name") unless queue_name
56
-
57
- if params[:max_rate] || params[:window_size]
58
- self.create_consumer(
59
- queue_name,
60
- params[:filter],
61
- params[:window_size],
62
- params[:max_rate],
63
- params[:browse_only].nil? ? false : params[:browse_only])
213
+ if params.kind_of?(Hash)
214
+ raise("Missing mandatory parameter :queue_name") unless queue_name = params[:queue_name]
215
+
216
+ if params[:max_rate] || params[:window_size]
217
+ self.create_consumer(
218
+ queue_name,
219
+ params[:filter],
220
+ params[:window_size],
221
+ params[:max_rate],
222
+ params.fetch(:browse_only, false))
223
+ else
224
+ self.create_consumer(
225
+ queue_name,
226
+ params[:filter],
227
+ params.fetch(:browse_only, false))
228
+ end
64
229
  else
65
- self.create_consumer(
66
- queue_name,
67
- params[:filter],
68
- params[:browse_only].nil? ? false : params[:browse_only])
230
+ self.create_consumer(params)
69
231
  end
70
232
  end
71
233
 
@@ -130,8 +292,7 @@ module Java::org.hornetq.api.core.client::ClientSession
130
292
  # Creates a RequestorPattern to send a request and to synchronously wait for
131
293
  # the reply, call the supplied block, then close the requestor
132
294
  # Returns the result from the block
133
- def requestor(request_address)
134
- requestor = nil
295
+ def requestor(request_address,&block)
135
296
  begin
136
297
  requestor = self.create_requestor(request_address)
137
298
  block.call(requestor)
@@ -150,7 +311,6 @@ module Java::org.hornetq.api.core.client::ClientSession
150
311
  # replies, call the supplied block, then close the server
151
312
  # Returns the result from the block
152
313
  def server(input_queue, timeout=0, &block)
153
- server = nil
154
314
  begin
155
315
  server = self.create_server(input_queue, timeout)
156
316
  block.call(server)
@@ -158,7 +318,8 @@ module Java::org.hornetq.api.core.client::ClientSession
158
318
  server.close if server
159
319
  end
160
320
  end
161
-
321
+
322
+ # Create a queue if it doesn't already exist
162
323
  def create_queue_ignore_exists(address, queue, durable)
163
324
  begin
164
325
  create_queue(address, queue, durable)
@@ -2,7 +2,24 @@
2
2
 
3
3
  # For the HornetQ Java documentation for this class see:
4
4
  # http://hornetq.sourceforge.net/docs/hornetq-2.1.0.Final/api/index.html?org/hornetq/api/core/client/ClientConsumer.html
5
-
5
+ #
6
+ # Other methods still directly accessible through this class:
7
+ #
8
+ # void close()
9
+ # Closes the consumer
10
+ #
11
+ # boolean closed?
12
+ # Returns whether the consumer is closed or not
13
+ #
14
+ # Note: receive can be used directly, but it is recommended to use #each where possible
15
+ #
16
+ # ClientMessage receive()
17
+ # Receives a message from a queue
18
+ # ClientMessage receive(long timeout)
19
+ # Receives a message from a queue
20
+ # ClientMessage receive_immediate()
21
+ # Receives a message from a queue
22
+ #
6
23
  class Java::org.hornetq.core.client.impl::ClientConsumerImpl
7
24
 
8
25
  # For each message available to be consumed call the block supplied
@@ -23,27 +40,27 @@ class Java::org.hornetq.core.client.impl::ClientConsumerImpl
23
40
  # and the time it took to process them.
24
41
  # Statistics are cumulative between calls to ::each and will only be
25
42
  # reset when ::each is called again with :statistics => true
26
- def each(parms={}, &proc)
43
+ def each(params={}, &proc)
27
44
  raise "Consumer::each requires a code block to be executed for each message received" unless proc
28
45
 
29
46
  message_count = nil
30
47
  start_time = nil
31
- timeout = (parms[:timeout] || 0).to_i
48
+ timeout = (params[:timeout] || 0).to_i
32
49
 
33
- if parms[:statistics]
50
+ if params[:statistics]
34
51
  message_count = 0
35
52
  start_time = Time.now
36
53
  end
37
54
 
38
55
  # Receive messages according to timeout
39
- while message = self.receive_with_timeout(timeout) do
56
+ while message = receive_with_timeout(timeout) do
40
57
  proc.call(message)
41
58
  message_count += 1 if message_count
42
59
  end
43
60
 
44
61
  unless message_count.nil?
45
62
  duration = Time.now - start_time
46
- {:messages => message_count,
63
+ { :count => message_count,
47
64
  :duration => duration,
48
65
  :messages_per_second => (message_count/duration).to_i}
49
66
  end
@@ -67,11 +84,11 @@ class Java::org.hornetq.core.client.impl::ClientConsumerImpl
67
84
  #
68
85
  # The statistics gathered are returned when :statistics => true and :async => false
69
86
  #
70
- def on_message(parms={}, &proc)
87
+ def on_message(params={}, &proc)
71
88
  raise "Consumer::on_message requires a code block to be executed for each message received" unless proc
72
89
 
73
- @listener = HornetQ::Client::MessageHandler.new(parms, &proc)
74
- self.setMessageListener @listener
90
+ @listener = HornetQ::Client::MessageHandler.new(params, &proc)
91
+ setMessageHandler @listener
75
92
  end
76
93
 
77
94
  # Return the current statistics for a running ::on_message
@@ -1,6 +1,119 @@
1
-
2
- # Cannot add to the interface Java::org.hornetq.api.core::Message because these
3
- # methods access instance variables in the Java object
1
+ #
2
+ # Message
3
+ #
4
+ # A Message is a routable instance that has a payload.
5
+ #
6
+ # The payload (the "body") is opaque to the messaging system. A Message also has
7
+ # a fixed set of headers (required by the messaging system) and properties
8
+ # (defined by the users) that can be used by the messaging system to route the
9
+ # message (e.g. to ensure it matches a queue filter).
10
+ #
11
+ # See: http://hornetq.sourceforge.net/docs/hornetq-2.1.0.Final/api/org/hornetq/api/core/client/ClientMessage.html
12
+ #
13
+ # Other methods still directly accessible through this class:
14
+ #
15
+ # void acknowledge()
16
+ # Acknowledge reception of this message. If the session responsible to
17
+ # acknowledge this message has :auto_commit_acks => true, the
18
+ # transaction will automatically commit the current transaction.
19
+ # Otherwise, this acknowledgement will not be committed until the
20
+ # client commits the session transaction
21
+ #
22
+ # Message attribute methods available directly from the Java Message class:
23
+ #
24
+ # String address()
25
+ # Returns the address this message is sent to.
26
+ # void address=(SimpleString address)
27
+ # Sets the address to send this message to
28
+ #
29
+ # int body_size()
30
+ # Return the size (in bytes) of this message's body
31
+ #
32
+ # int delivery_count()
33
+ # Returns the number of times this message was delivered
34
+ #
35
+ # boolean durable?()
36
+ # Returns whether this message is durable or not
37
+ # void durable=(boolean durable)
38
+ # Sets whether this message is durable or not.
39
+ #
40
+ # int encode_size()
41
+ # Returns the size of the encoded message
42
+ #
43
+ # boolean expired?()
44
+ # Returns whether this message is expired or not
45
+ #
46
+ # long expiration()
47
+ # Returns the expiration time of this message
48
+ # void expiration=(long expiration)
49
+ # Sets the expiration of this message.
50
+ #
51
+ # boolean large_message?()
52
+ # Returns whether this message is a large message or a regular message
53
+ #
54
+ # long message_id()
55
+ # Returns the messageID
56
+ #
57
+ # byte priority()
58
+ # Returns the message priority.
59
+ # Values range from 0 (less priority) to 9 (more priority) inclusive.
60
+ # void priority=(byte priority)
61
+ # Sets the message priority.
62
+ # Value must be between 0 and 9 inclusive.
63
+ #
64
+ # #TODO Add timestamp_time attribute that converts to/from expiration under the covers
65
+ # long timestamp()
66
+ # Returns the message timestamp. The timestamp corresponds to the time
67
+ # this message was handled by a HornetQ server.
68
+ # void timestamp=(long timestamp)
69
+ # Sets the message timestamp.
70
+ #
71
+ # byte type()
72
+ # Returns this message type
73
+ # See: type_sym below for dealing with message types using Ruby Symbols
74
+ #
75
+ # org.hornetq.utils.UUID user_id()
76
+ # Returns the userID - this is an optional user specified UUID that can be set to identify the message and will be passed around with the message
77
+ # void user_id=(org.hornetq.utils.UUID userID)
78
+ # Sets the user ID
79
+ #
80
+ # Methods available directly for dealing with properties:
81
+ #
82
+ # boolean contains_property?(key)
83
+ # Returns true if this message contains a property with the given key, false else
84
+ #
85
+ # Note: Several other property methods are available directly, but since JRuby
86
+ # deals with the conversion for you they are not documented here
87
+ #
88
+ # Other methods still directly accessible through this class from its child classes:
89
+ #
90
+ # HornetQBuffer body_buffer()
91
+ # Returns the message body as a HornetQBuffer
92
+ #
93
+ # Map<String,Object> toMap()
94
+ #
95
+ #
96
+ # Methods for dealing with large messages:
97
+ #
98
+ # void save_to_output_stream(OutputStream out)
99
+ # Saves the content of the message to the OutputStream.
100
+ # It will block until the entire content is transfered to the OutputStream.
101
+ #
102
+ # void body_input_stream=(InputStream bodyInputStream)
103
+ # Sets the body's IntputStream.
104
+ # This method is used when sending large messages
105
+ #
106
+ # void output_stream=(OutputStream out)
107
+ # Sets the OutputStream that will receive the content of a message received
108
+ # in a non blocking way. This method is used when consuming large messages
109
+ #
110
+ # boolean wait_output_stream_completion(long timeMilliseconds)
111
+ # Wait the outputStream completion of the message. This method is used when consuming large messages
112
+ # timeMilliseconds - - 0 means wait forever
113
+ #
114
+ # Developer notes:
115
+ # Cannot add to the interface Java::org.hornetq.api.core::Message because these
116
+ # methods access instance variables in the Java object
4
117
  class Java::OrgHornetqCoreClientImpl::ClientMessageImpl
5
118
  # Attributes
6
119
  # attr_accessor :address, :type, :durable, :expiration, :priority, :timestamp, :user_id
@@ -31,18 +144,78 @@ class Java::OrgHornetqCoreClientImpl::ClientMessageImpl
31
144
 
32
145
  put_string_property(Java::OrgHornetqCoreClientImpl::ClientMessageImpl::REPLYTO_HEADER_NAME, val)
33
146
  end
147
+
148
+ # Returns the message type as one of the following symbols
149
+ # :text => org.hornetq.api.core.Message::TEXT_TYPE
150
+ # :bytes => org.hornetq.api.core.Message::BYTES_TYPE
151
+ # :map => org.hornetq.api.core.Message::MAP_TYPE
152
+ # :object => org.hornetq.api.core.Message::OBJECT_TYPE
153
+ # :stream => org.hornetq.api.core.Message::STREAM_TYPE
154
+ # :default => org.hornetq.api.core.Message::DEFAULT_TYPE
155
+ # :unknown => Any other value for message type
156
+ #
157
+ # If the type is none of the above, nil is returned
158
+ #
159
+ def type_sym
160
+ case self.type
161
+ when Java::org.hornetq.api.core.Message::TEXT_TYPE #3
162
+ :text
163
+ when Java::org.hornetq.api.core.Message::BYTES_TYPE #4
164
+ :bytes
165
+ when Java::org.hornetq.api.core.Message::MAP_TYPE #5
166
+ :map
167
+ when Java::org.hornetq.api.core.Message::OBJECT_TYPE #2
168
+ :object
169
+ when Java::org.hornetq.api.core.Message::STREAM_TYPE #6
170
+ :stream
171
+ when Java::org.hornetq.api.core.Message::DEFAULT_TYPE #0
172
+ :default
173
+ else
174
+ :unknown
175
+ end
176
+ end
177
+
178
+ # Set the message type using a Ruby symbol
179
+ # Parameters
180
+ # sym: Must be any one of the following symbols
181
+ # :text => org.hornetq.api.core.Message::TEXT_TYPE
182
+ # :bytes => org.hornetq.api.core.Message::BYTES_TYPE
183
+ # :map => org.hornetq.api.core.Message::MAP_TYPE
184
+ # :object => org.hornetq.api.core.Message::OBJECT_TYPE
185
+ # :stream => org.hornetq.api.core.Message::STREAM_TYPE
186
+ # :default => org.hornetq.api.core.Message::DEFAULT_TYPE
187
+ #
188
+ def type_sym=(sym)
189
+ case sym
190
+ when :text
191
+ self.type = Java::org.hornetq.api.core.Message::TEXT_TYPE #3
192
+ when :bytes
193
+ self.type = Java::org.hornetq.api.core.Message::BYTES_TYPE #4
194
+ when :map
195
+ self.type = Java::org.hornetq.api.core.Message::MAP_TYPE #5
196
+ when :object
197
+ self.type = Java::org.hornetq.api.core.Message::OBJECT_TYPE #2
198
+ when :stream
199
+ self.type = Java::org.hornetq.api.core.Message::STREAM_TYPE #6
200
+ when :default
201
+ self.type = Java::org.hornetq.api.core.Message::DEFAULT_TYPE #0
202
+ else
203
+ raise "Invalid message type_sym:#{sym.to_s}"
204
+ end
205
+ end
34
206
 
35
207
  # Return the body for this message
36
208
  # TODO: Do remaining message Types
37
209
  def body
38
210
  # Allow this buffer to be read multiple times
39
- body_buffer.reset_reader_index
211
+ buf = body_buffer
212
+ buf.reset_reader_index
213
+ available = body_size
214
+
215
+ return nil if available == 0
40
216
 
41
217
  case type
42
218
  when Java::org.hornetq.api.core.Message::BYTES_TYPE #4
43
- buf = body_buffer
44
- buf.reset_reader_index
45
- available = body_size
46
219
  result = ""
47
220
  bytes_size = 1024
48
221
  bytes = Java::byte[bytes_size].new
@@ -145,29 +318,6 @@ class Java::OrgHornetqCoreClientImpl::ClientMessageImpl
145
318
  property_exists(key.to_s) == true
146
319
  end
147
320
 
148
- # call-seq:
149
- # body_buffer
150
- #
151
- # Return the message body as a HornetQBuffer
152
- #
153
-
154
- # call-seq:
155
- # to_map
156
- #
157
- # Return the Message as a Map
158
- #
159
-
160
- # call-seq:
161
- # remove_property(key)
162
- #
163
- # Remove a property
164
-
165
- # call-seq:
166
- # contains_property(key)
167
- #
168
- # Returns true if this message contains a property with the given key
169
- # TODO: Symbols?
170
-
171
321
  # Return TypedProperties
172
322
  def getProperties
173
323
  properties
@@ -187,19 +337,24 @@ class Java::OrgHornetqCoreClientImpl::ClientMessageImpl
187
337
  def attributes
188
338
  {
189
339
  :address => address.nil? ? '' : address.to_string,
190
- :type => type,
191
- :durable => durable,
340
+ :body_size => body_size,
341
+ :delivery_count => delivery_count,
342
+ :durable? => durable?,
343
+ :encode_size => encode_size,
344
+ :expired? => expired?,
192
345
  :expiration => expiration,
193
- :priority => priority,
346
+ :large_message? => large_message?,
347
+ :message_id => message_id,
348
+ :priority => priority,
194
349
  :timestamp => timestamp,
350
+ :type_sym => type_sym,
195
351
  :user_id => user_id,
196
- :encode_size => encode_size
197
352
  }
198
353
  end
199
354
 
200
355
  # Does not include the body since it can only read once
201
356
  def inspect
202
- "#{self.class.name}:\nAttributes: #{attributes.inspect}\nProperties: #{properties.inspect}"
357
+ "#{self.class.name}:\nBody: #{body.inspect}\nAttributes: #{attributes.inspect}\nProperties: #{properties.inspect}"
203
358
  end
204
359
 
205
360
  end