jruby-hornetq 0.2.0.alpha → 0.2.1.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/HISTORY.md +8 -0
  2. data/README.md +88 -5
  3. data/Rakefile +4 -4
  4. data/bin/hornetq_server +26 -55
  5. data/examples/{batch_client.rb → client/advanced/batch_client.rb} +11 -4
  6. data/examples/{client.rb → client/advanced/client.rb} +8 -10
  7. data/examples/{consumer.rb → client/advanced/consumer.rb} +2 -2
  8. data/examples/{hornetq.yml → client/advanced/hornetq.yml} +11 -10
  9. data/examples/{multi_client.rb → client/advanced/multi_client.rb} +6 -3
  10. data/examples/{multi_consumer.rb → client/advanced/multi_consumer.rb} +2 -2
  11. data/examples/{producer.rb → client/advanced/producer.rb} +3 -4
  12. data/examples/{server.rb → client/advanced/server.rb} +6 -9
  13. data/examples/client/client.rb +31 -0
  14. data/examples/client/consumer.rb +22 -0
  15. data/examples/client/invm.rb +38 -0
  16. data/examples/client/producer.rb +21 -0
  17. data/examples/client/server.rb +31 -0
  18. data/examples/server/backup_server.yml +6 -0
  19. data/examples/server/live_server.yml +1 -0
  20. data/examples/server/standalone_server.yml +1 -0
  21. data/lib/data/bindings/hornetq-bindings-1.bindings +0 -0
  22. data/lib/data/bindings/hornetq-bindings-2.bindings +0 -0
  23. data/lib/hornetq.rb +30 -9
  24. data/lib/hornetq/client.rb +19 -0
  25. data/lib/hornetq/{hornet_q_client.rb → client/factory.rb} +85 -88
  26. data/lib/hornetq/{org_hornetq_api_core_client_client_session.rb → client/org_hornetq_api_core_client_client_session.rb} +2 -2
  27. data/lib/hornetq/{org_hornetq_core_client_impl_client_message_impl.rb → client/org_hornetq_core_client_impl_client_message_impl.rb} +62 -2
  28. data/lib/hornetq/{org_hornetq_core_client_impl_client_producer_impl.rb → client/org_hornetq_core_client_impl_client_producer_impl.rb} +0 -0
  29. data/lib/hornetq/{org_hornetq_utils_typed_properties.rb → client/org_hornetq_utils_typed_properties.rb} +0 -0
  30. data/lib/hornetq/{client_requestor.rb → client/requestor.rb} +2 -2
  31. data/lib/hornetq/{client_server.rb → client/server.rb} +2 -2
  32. data/lib/hornetq/{session_pool.rb → client/session_pool.rb} +20 -20
  33. data/lib/hornetq/{lib → java}/hornetq-core-client.jar +0 -0
  34. data/lib/hornetq/{lib → java}/hornetq-core.jar +0 -0
  35. data/lib/hornetq/{lib → java}/netty.jar +0 -0
  36. data/lib/hornetq/org_hornetq_core_server_hornet_q_server.rb +13 -0
  37. data/lib/hornetq/server.rb +12 -0
  38. data/lib/hornetq/server/factory.rb +86 -0
  39. data/lib/hornetq/uri.rb +59 -0
  40. data/test/server_factory_test.rb +184 -0
  41. data/test/uri_test.rb +74 -0
  42. metadata +44 -28
  43. data/examples/backup_server.yml +0 -4
  44. data/examples/live_server.yml +0 -5
  45. data/examples/run_broker.rb +0 -59
  46. data/examples/standalone_server.yml +0 -3
data/HISTORY.md CHANGED
@@ -1,4 +1,12 @@
1
+ ## 0.2.1 (2011-01-26)
1
2
 
3
+ * Support for InVM Server
4
+ * InVM Example
5
+
6
+ ## 0.2.0 (2011-01-19)
7
+
8
+ * New Namespace HornetQ::Server and HornetQ::Client
9
+ * Improved Examples
2
10
 
3
11
  ## 0.0.1 (2011-01-18)
4
12
 
data/README.md CHANGED
@@ -111,14 +111,96 @@ Producer-Consumer
111
111
 
112
112
  Producer: Write messages to a queue:
113
113
 
114
- ....
114
+ require 'rubygems'
115
+ require 'hornetq'
116
+
117
+ HornetQ::Client::Factory.create_session(:connector=> {:uri => 'hornetq://localhost'}) do |session|
118
+ # Create Producer so that we can send messages to the Address 'jms.queue.ExampleQueue'
119
+ producer = session.create_producer('jms.queue.ExampleQueue')
120
+
121
+ # Create a non-durable message to send
122
+ message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
123
+ message << "#{Time.now}: ### Hello, World ###"
124
+
125
+ producer.send(message)
126
+ end
127
+
115
128
 
116
129
  Consumer: Read message from a queue:
117
- ....
130
+
131
+ require 'rubygems'
132
+ require 'hornetq'
133
+
134
+ HornetQ::Client::Factory.start(:connector=> {:uri => 'hornetq://localhost'}) do |session|
135
+ consumer = session.create_consumer('jms.queue.ExampleQueue')
136
+
137
+ # Receive a single message, return immediately if no message available
138
+ if message = consumer.receive_immediate
139
+ puts "Received:[#{message.body}]"
140
+ message.acknowledge
141
+ else
142
+ puts "No message found"
143
+ end
144
+ end
118
145
 
119
146
  Client-Server
120
147
  -------------
121
148
 
149
+ Server: Receive requests and send back a reply
150
+
151
+ require 'rubygems'
152
+ require 'hornetq'
153
+
154
+ # Shutdown Server after 5 minutes of inactivity, set to 0 to wait forever
155
+ timeout = 300000
156
+
157
+ HornetQ::Client::Factory.start(:connector=> {:uri => 'hornetq://localhost'}) do |session|
158
+ server = session.create_server('jms.queue.ExampleQueue', timeout)
159
+
160
+ puts "Waiting for Requests..."
161
+ server.run do |request_message|
162
+ puts "Received:[#{request_message.body}]"
163
+
164
+ # Create Reply Message
165
+ reply_message = session.create_message(HornetQ::Client::Message::TEXT_TYPE, false)
166
+ reply_message.body = "Echo [#{request_message.body}]"
167
+
168
+ # The result of the block is the message to be sent back to the client
169
+ reply_message
170
+ end
171
+
172
+ # Server will stop after timeout period after no messages received
173
+ server.close
174
+ end
175
+
176
+
177
+ Client: Send a request and wait for a reply
178
+
179
+ require 'rubygems'
180
+ require 'hornetq'
181
+
182
+ # Wait 5 seconds for a reply
183
+ timeout = 5000
184
+
185
+ HornetQ::Client::Factory.start(:connector=> {:uri => 'hornetq://localhost'}) do |session|
186
+ requestor = session.create_requestor('jms.queue.ExampleQueue')
187
+
188
+ # Create non-durable message
189
+ message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
190
+ message.body = "Request Current Time"
191
+
192
+ # Send message to the queue
193
+ puts "Send request message and wait for Reply"
194
+ if reply = requestor.request(message, timeout)
195
+ puts "Received Response: #{reply.inspect}"
196
+ puts " Message: #{reply.body.inspect}"
197
+ else
198
+ puts "Time out, No reply received after #{timeout/1000} seconds"
199
+ end
200
+
201
+ requestor.close
202
+ end
203
+
122
204
 
123
205
  Threading
124
206
  ---------
@@ -164,12 +246,12 @@ client, it also supports using JRuby to launch a Broker instance
164
246
 
165
247
  #### Starting up a standalone hornetq server:
166
248
 
167
- bin/hornetq_server examples/standalone_server.yml
249
+ bin/hornetq_server examples/server/standalone_server.yml
168
250
 
169
251
  #### Starting up a backup/live combination
170
252
 
171
- bin/hornetq_server examples/backup_server.yml
172
- bin/hornetq_server examples/live_server.yml
253
+ bin/hornetq_server examples/server/backup_server.yml
254
+ bin/hornetq_server examples/server/live_server.yml
173
255
 
174
256
  Development
175
257
  -----------
@@ -222,6 +304,7 @@ Authors
222
304
  -------
223
305
 
224
306
  Reid Morrison :: rubywmq@gmail.com :: @reidmorrison
307
+
225
308
  Brad Pardee :: bpardee@gmail.com
226
309
 
227
310
  [1]: http://help.github.com/forking/
data/Rakefile CHANGED
@@ -8,10 +8,10 @@ desc "Build gem"
8
8
  task :gem do |t|
9
9
  gemspec = Gem::Specification.new do |s|
10
10
  s.name = 'jruby-hornetq'
11
- s.version = '0.2.0.alpha'
12
- s.author = 'Reid Morrison'
13
- s.email = 'rubywmq@gmail.com'
14
- s.homepage = 'http://www.reidmorrison.com/'
11
+ s.version = '0.2.1.alpha'
12
+ s.authors = ['Reid Morrison', 'Brad Pardee']
13
+ s.email = ['rubywmq@gmail.com', 'bpardee@gmail.com']
14
+ s.homepage = 'https://github.com/ClarityServices/jruby-hornetq'
15
15
  s.date = Date.today.to_s
16
16
  s.description = 'JRuby-HornetQ is a Java and Ruby library that exposes the HornetQ Java API in a ruby friendly way. For JRuby only.'
17
17
  s.summary = 'JRuby interface into HornetQ'
@@ -1,70 +1,41 @@
1
1
  #!/usr/bin/env jruby
2
2
 
3
+ require 'rubygems'
3
4
  require 'yaml'
4
-
5
- raise 'Environment variable HORNETQ_HOME not set' unless ENV['HORNETQ_HOME']
6
- require "#{ENV['HORNETQ_HOME']}/lib/hornetq-core.jar"
7
- require "#{ENV['HORNETQ_HOME']}/lib/netty.jar"
5
+ require 'hornetq'
8
6
 
9
7
  unless ARGV[0]
10
- $stderr.puts "Usage: hornetq_server <yml-file>"
11
- exit 1
12
- end
13
- yaml = YAML.load_file(ARGV[0])
14
- data_directory = yaml['data_directory'] || './data'
15
- host = yaml['host'] || 'localhost'
16
- port = yaml['port'] || 5445
8
+ $stderr.puts <<EOF
17
9
 
18
- config = Java::org.hornetq.core.config.impl.ConfigurationImpl.new
19
- config.persistence_enabled = false
20
- config.security_enabled = false
21
- config.paging_directory = "#{data_directory}/paging"
22
- config.bindings_directory = "#{data_directory}/bindings"
23
- config.journal_directory = "#{data_directory}/journal"
24
- config.journal_min_files = 10
25
- config.large_messages_directory = "#{data_directory}/large-messages"
10
+ Usage: hornetq_server <uri-or-yml-file>
26
11
 
27
- if Java::org.hornetq.core.journal.impl.AIOSequentialFileFactory.isSupported
28
- config.journal_type = Java::org.hornetq.core.server.JournalType::ASYNCIO
29
- else
30
- puts("AIO wasn't located on this platform, it will fall back to using pure Java NIO. If your platform is Linux, install LibAIO to enable the AIO journal");
31
- config.journal_type = Java::org.hornetq.core.server.JournalType::NIO
32
- end
12
+ Examples:
33
13
 
34
- netty_acceptor_class_name = Java::org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory.java_class.name
35
- netty_connector_class_name = Java::org.hornetq.core.remoting.impl.netty.NettyConnectorFactory.java_class.name
14
+ # start standalone server on port #{HornetQ::DEFAULT_NETTY_PORT}
15
+ hornetq_server hornetq://0.0.0.0/?data_directory=./data
36
16
 
37
- transport_conf_params = java.util.HashMap.new
38
- transport_conf_params.put('host', host)
39
- transport_conf_params.put('port', java.lang.Integer.new(port))
40
- transport_conf = Java::org.hornetq.api.core.TransportConfiguration.new(netty_acceptor_class_name, transport_conf_params);
17
+ # start backup server
18
+ hornetq_server hornetq://0.0.0.0:5446/?backup=true\\&data_directory=./data_backup
41
19
 
42
- transport_conf_set = java.util.HashSet.new
43
- transport_conf_set.add(transport_conf)
20
+ # start live server attached to backup on same server
21
+ hornetq_server hornetq://0.0.0.0:5445,localhost:5446/?data_directory=./data
44
22
 
45
- config.acceptor_configurations = transport_conf_set
23
+ EOF
24
+ exit 1
25
+ end
46
26
 
47
- if yaml['backup']
48
- puts "backup"
49
- config.backup = true
50
- config.shared_store = false
51
- elsif yaml['backup_host']
52
- puts "live"
53
- backup_params = java.util.HashMap.new
54
- backup_params.put('host', yaml['backup_host'])
55
- backup_port = yaml['backup_port'] || 5445
56
- backup_params.put('port', java.lang.Integer.new(backup_port))
57
- #backup_params.put('reconnectAttempts', -1)
58
- backup_connector_conf = Java::org.hornetq.api.core.TransportConfiguration.new(netty_connector_class_name, backup_params);
59
-
60
- connector_conf_map = java.util.HashMap.new
61
- connector_conf_map.put('backup-connector', backup_connector_conf)
62
-
63
- config.connector_configurations = connector_conf_map
64
- config.backup_connector_name = 'backup-connector'
27
+ # Check if the argument is a yaml file or a uri
28
+ if ARGV[0] =~ /\.ya?ml$/
29
+ config = YAML.load_file(ARGV[0])
30
+ # Allow sub items
31
+ (1...ARGV.size).each do |i|
32
+ config = config[ARGV[i]] || config[ARGV[i].to_sym]
33
+ end
34
+ puts "config=#{config.inspect}"
35
+ server = HornetQ::Server::Factory.create_server(config)
65
36
  else
66
- puts 'standalone'
37
+ uri = ARGV[0]
38
+ server = HornetQ::Server::Factory.create_server(uri)
67
39
  end
68
-
69
- server = Java::org.hornetq.core.server.HornetQServers.newHornetQServer(config)
40
+ server.enable_shutdown_on_signal
70
41
  server.start
@@ -2,9 +2,17 @@
2
2
  # HornetQ Batch Requestor:
3
3
  # Submit a batch of requests and wait for replies
4
4
  #
5
+ # This is an advanced use case where the client submits requests in a controlled
6
+ # fashion. The alternative would be just to submit all requests at the same time,
7
+ # however then it becomes extremely difficult to pull back submitted requests
8
+ # if say 80% of the first say 100 requests fail.
9
+ #
10
+ # This sample sends a total of 100 requests in batches of 10.
11
+ # One thread sends requests and the other processes replies.
12
+ # Once 80% of the replies are back, it will send the next batch
5
13
 
6
14
  # Allow examples to be run in-place without requiring a gem install
7
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
15
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../../lib'
8
16
 
9
17
  require 'rubygems'
10
18
  require 'yaml'
@@ -13,7 +21,6 @@ require 'sync'
13
21
 
14
22
  total_count = (ARGV[0] || 100).to_i
15
23
  batching_size = (ARGV[1] || 10).to_i
16
- timeout = (ARGV[2] || 10000).to_i
17
24
  request_address = 'jms.queue.ExampleQueue'
18
25
 
19
26
  config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
@@ -55,7 +62,7 @@ class BatchClient
55
62
  #print "Sending #{total_count} messages"
56
63
  start_time = Time.now
57
64
  total_count.times do |i|
58
- message = @session.create_message(HornetQClient::Message::TEXT_TYPE,false)
65
+ message = @session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
59
66
  message.reply_to_queue_name = @consumer.queue_name
60
67
  message << "Request Current Time. #{i}"
61
68
  @producer.send(message)
@@ -89,7 +96,7 @@ class BatchClient
89
96
  end
90
97
 
91
98
  # Create a HornetQ session
92
- HornetQClient::Factory.create_session(config) do |session|
99
+ HornetQ::Client::Factory.create_session(config) do |session|
93
100
  batching_size = total_count if batching_size > total_count
94
101
 
95
102
  client = BatchClient.new(session, request_address)
@@ -4,7 +4,7 @@
4
4
  #
5
5
 
6
6
  # Allow examples to be run in-place without requiring a gem install
7
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
7
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../../lib'
8
8
 
9
9
  require 'rubygems'
10
10
  require 'yaml'
@@ -16,29 +16,27 @@ timeout = (ARGV[1] || 30000).to_i
16
16
  config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
17
17
 
18
18
  # Create a HornetQ session
19
- HornetQClient::Factory.create_session(config) do |session|
19
+ HornetQ::Client::Factory.create_session(config) do |session|
20
20
  #session.create_queue('Example', 'Example', true)
21
21
  requestor = session.create_requestor('jms.queue.ExampleQueue')
22
22
  session.start
23
23
  start_time = Time.now
24
24
 
25
25
  puts "Sending messages"
26
- count.times do |i|
27
- message = session.create_message(HornetQClient::Message::TEXT_TYPE,false)
26
+ (1..count).each do |i|
27
+ message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
28
28
  # Set the message body text
29
29
  message << "Request Current Time"
30
30
  # Set the user managed message id
31
31
  message.user_id = Java::org.hornetq.utils::UUIDGenerator.getInstance.generateUUID
32
- # Send message to the queue
33
- puts "Sending Request"
32
+ # Send request message and wait for reply
34
33
  if reply = requestor.request(message, timeout)
35
- puts "Received Response: #{reply.inspect}"
36
- puts " Message:[#{reply.body.inspect}]"
37
- #print "."
34
+ puts "Received Response: #{reply.inspect}" if count < 10
35
+ puts " Message:[#{reply.body.inspect}]" if count < 10
36
+ print "." if count >= 10
38
37
  else
39
38
  puts "Time out, No reply received after #{timeout/1000} seconds"
40
39
  end
41
- #p message
42
40
  puts "#{i}" if i%1000 == 0
43
41
  puts "Durable" if message.durable
44
42
  end
@@ -4,7 +4,7 @@
4
4
  #
5
5
 
6
6
  # Allow examples to be run in-place without requiring a gem install
7
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
7
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../../lib'
8
8
 
9
9
  require 'rubygems'
10
10
  require 'yaml'
@@ -15,7 +15,7 @@ timeout = (ARGV[0] || 1000).to_i
15
15
  config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
16
16
 
17
17
  # Create a HornetQ session
18
- HornetQClient::Factory.create_session(config) do |session|
18
+ HornetQ::Client::Factory.create_session(config) do |session|
19
19
  consumer = session.create_consumer('jms.queue.ExampleQueue')
20
20
  session.start
21
21
 
@@ -15,22 +15,23 @@ full_example:
15
15
  :connector:
16
16
  # The uri is written as follows for the NettyConnectorFactory.
17
17
  # protocol=netty is the default and therefore not required
18
- :uri: hornetq://localhost:5445,backupserver:5445/?protocol=netty
18
+ :uri: hornetq://localhost:5445,backuphost:5445/?protocol=netty
19
19
  # Or, the uri is written as follows for the InVM
20
- :uri: hornetq://localhost/?protocol=invm
20
+ :uri: hornetq://invm
21
21
  # Or, the uri is written as follows for auto-discovery
22
- :uri: hornetq://discoveryserver:5445/?protocol=discovery
22
+ :uri: hornetq://discoveryhost:5445/?protocol=discovery
23
23
 
24
24
  # For a static cluster list as an array of URI's
25
25
  :uri:
26
- - netty://server1:5445,server1backup:5445
27
- - netty://server2:5445,server2backup:5445
26
+ - hornetq://server1:5445,server1backup:5445
27
+ - hornetq://server2:5445,server2backup:5445
28
28
  # URI format:
29
- # [netty|invm|discovery]://host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
30
- :options:
31
- :failover_on_initial_connection: true
32
- :failover_on_server_shutdown: true
33
- :reconnect_attempts: -1
29
+ # hornetq://host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
30
+ # where options can be any of
31
+ # protocol=[netty|invm|discovery]
32
+ :failover_on_initial_connection: true
33
+ :failover_on_server_shutdown: true
34
+ :reconnect_attempts: -1
34
35
  :session:
35
36
  :username: guest
36
37
  :password: guest
@@ -4,9 +4,12 @@
4
4
  # Typical scenario is in a Rails app when we need to do a call to a
5
5
  # remote server and block until a response is received
6
6
  #
7
+ # Shows how to use the session pool so that not every thread has to have its
8
+ # own session
9
+ #
7
10
 
8
11
  # Allow examples to be run in-place without requiring a gem install
9
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
12
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../../lib'
10
13
 
11
14
  require 'rubygems'
12
15
  require 'yaml'
@@ -22,7 +25,7 @@ def worker_thread(id, session_pool)
22
25
  begin
23
26
  # Obtain a session from the pool and return when complete
24
27
  session_pool.requestor('jms.queue.ExampleQueue') do |session, requestor|
25
- message = session.create_message(HornetQClient::Message::TEXT_TYPE,false)
28
+ message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
26
29
  message << "Request Current Time"
27
30
 
28
31
  # Send message to the queue
@@ -42,7 +45,7 @@ def worker_thread(id, session_pool)
42
45
  end
43
46
 
44
47
  # Create a HornetQ Factory
45
- HornetQClient::Factory.create_factory(config[:connector]) do |factory|
48
+ HornetQ::Client::Factory.create_factory(config[:connector]) do |factory|
46
49
 
47
50
  # Create a pool of session connections, all with the same session parameters
48
51
  # The pool is thread-safe and can be accessed concurrently by multiple threads
@@ -4,7 +4,7 @@
4
4
  #
5
5
 
6
6
  # Allow examples to be run in-place without requiring a gem install
7
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
7
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../../lib'
8
8
 
9
9
  require 'rubygems'
10
10
  require 'yaml'
@@ -44,7 +44,7 @@ def worker(id, session)
44
44
  end
45
45
 
46
46
  # Create a HornetQ session
47
- HornetQClient::Factory.create_factory(config[:connector]) do |factory|
47
+ HornetQ::Client::Factory.create_factory(config[:connector]) do |factory|
48
48
  threads = []
49
49
  $thread_count.times do |i|
50
50
  session = factory.create_session(config[:session])
@@ -4,7 +4,7 @@
4
4
  #
5
5
 
6
6
  # Allow examples to be run in-place without requiring a gem install
7
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
7
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/../../../lib'
8
8
 
9
9
  require 'rubygems'
10
10
  require 'yaml'
@@ -14,14 +14,13 @@ count = (ARGV[0] || 1).to_i
14
14
  config = YAML.load_file(File.dirname(__FILE__) + '/hornetq.yml')['development']
15
15
 
16
16
  # Create a HornetQ session
17
- HornetQClient::Factory.create_session(config) do |session|
18
- #session.create_queue('Example', 'Example', true)
17
+ HornetQ::Client::Factory.create_session(config) do |session|
19
18
  producer = session.create_producer('jms.queue.ExampleQueue')
20
19
  start_time = Time.now
21
20
 
22
21
  puts "Sending messages"
23
22
  (1..count).each do |i|
24
- message = session.create_message(HornetQClient::Message::TEXT_TYPE,false)
23
+ message = session.create_message(HornetQ::Client::Message::TEXT_TYPE,false)
25
24
  # Set the message body text
26
25
  message << "#{Time.now}: ### Hello, World ###"
27
26
  # Send message to the queue