JMS in JRuby with Spring JMS

Subscriber.rb:
require 'java'

include_class 'org.springframework.context.support.ClassPathXmlApplicationContext'

class Subscriber
  include javax.jms.MessageListener

  def initialize
    ctx = ClassPathXmlApplicationContext.new("subscriber.xml")
    @sub = ctx.getBean("topicSubscriberContainer")
    @sub.setMessageListener(self)
    @count = 0
  end

  def onMessage(msg)
    stop if (@count += 1) > 10000
    puts "#{@count}: #{msg.getJMSMessageID()}"
  end

  def start
    @sub.start
    sleep
  end

  def stop
    sleep 1
    @sub.stop
    java.lang.System.exit(0)
  end
end

subscriber = Subscriber.new
subscriber.start
Publisher.rb
require 'java'

include_class 'org.springframework.context.support.ClassPathXmlApplicationContext'

class Publisher

  def initialize
    ctx = ClassPathXmlApplicationContext.new("publisher.xml")
    con = ctx.getBean("topicPublisherConnectionFactory").createTopicConnection()
    @session = con.createTopicSession(false,javax.jms.Session::AUTO_ACKNOWLEDGE)
    @pub = @session.createPublisher(ctx.getBean("topicDestination"))
  end

  def send(text)
    msg = @session.createTextMessage(text)
    @pub.send(msg)
    puts "#{msg.getJMSMessageID()}"
  end

end

# data/text to publish
file = File.open("msg.txt","r")
data = file.read
file.close

publisher = Publisher.new
for i in (1..1000)
  publisher.send(data)
end
Peeker.rb
require 'java'

include_class 'org.springframework.context.support.ClassPathXmlApplicationContext'

class Peeker
  include javax.jms.MessageListener

  def initialize
    ctx = ClassPathXmlApplicationContext.new("peeker.xml")
    con = ctx.getBean("topicSubscriberConnectionFactory").createTopicConnection()
    topic = ctx.getBean("topicDestination")
    @session = con.createTopicSession(false,javax.jms.Session::CLIENT_ACKNOWLEDGE)
    @subscriber = @session.createDurableSubscriber(topic, $subscription_id, $selector, false)
    @subscriber.setMessageListener(self)
    @count = 0
  end

  def onMessage(msg)
    stop if (@count += 1) > 10
    puts "#{@count}: #{msg.getJMSMessageID()}"
    @file.write(msg.getText())
    # just to peek msgs, do not call # msg.acknowledge()
  end

  def start
    @file = File.open("#{$subscription_id}.txt","w")
    @session.start
    sleep
  end

  def stop
    sleep 1
    @file.close
    @session.stop
    java.lang.System.exit(0)
  end
end

$subscription_id = ENV['SubscriptionID']
$selector = ENV['Selector']

peeker = Peeker.new
peeker.start

Creative Commons License This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License. [by Kiyohito Yamamoto]