1 - fire up out of the box activemq installation. Literally that easy, just run bin/activemq &
2 - copy activemq-all-5.1.0.jar from activemq installation directory to the same directory as your JRuby scripts
3 - create the 2 scripts below , consumer.rb and producer.rb and you are off and running. For the Rails enthusiasts , I can imagine a very nice replacement for ActiveMessaging where you create a simple JMS library that will do an async post of messages to the queue, very nice indeed.
4 - Run each script in a separate window (jruby consumer.rb AND jruby producer.rb). Producer.rb will simply give you a ">" prompt to type some text to demonstrate the concept
Here is the code I ended up with:
consumer.rb
------------------------
require "java"
require "activemq-all-5.1.0.jar"
include_class "org.apache.activemq.ActiveMQConnectionFactory"
include_class "org.apache.activemq.util.ByteSequence"
include_class "org.apache.activemq.command.ActiveMQBytesMessage"
include_class "javax.jms.MessageListener"
include_class "javax.jms.Session"
class MessageHandler
include javax.jms.Session
include javax.jms.MessageListener
def onMessage(serialized_message)
message_body = serialized_message.get_content.get_data.inject("") { |body, byte| body << byte }
puts message_body
end
def run
factory = ActiveMQConnectionFactory.new("tcp://localhost:61616")
connection = factory.create_connection();
session = connection.create_session(false, Session::AUTO_ACKNOWLEDGE);
queue = session.create_queue("test1-queue");
consumer = session.create_consumer(queue);
consumer.set_message_listener(self);
connection.start();
puts "Listening..."
end
end
handler = MessageHandler.new
handler.run
producer.rb
--------------
require "java"
require "activemq-all-5.1.0.jar"
require 'readline'
include_class "org.apache.activemq.ActiveMQConnectionFactory"
include_class "org.apache.activemq.util.ByteSequence"
include_class "org.apache.activemq.command.ActiveMQBytesMessage"
include_class "javax.jms.MessageListener"
include_class "javax.jms.Session"
class MessageHandler
include javax.jms.Session
include javax.jms.MessageListener
def initialize
factory = ActiveMQConnectionFactory.new("tcp://localhost:61616")
connection = factory.create_connection();
@session = connection.create_session(false, Session::AUTO_ACKNOWLEDGE);
queue = @session.create_queue("test1-queue");
@producer = @session.create_producer(queue);
end
def send_message(line)
puts "received input of #{line}"
m = @session.createTextMessage() ;
m.set_text(line)
@producer.send(m)
end
end
handler = MessageHandler.new
loop do
line = Readline::readline('> ', true)
handler.send_message(line)
end