Topic subcsribers (non-durable) lose messages posted while subscriber is off-line.
According to documentation, a ruby stomp durable subscriber for apache activemq-5.3.0 has to set client-id header at connection and subscriber name at subscription.
Former is achieved with:
@conn = Stomp::Connection.open(@user, @password, @host, @port, true, 5, {"client-id" => "stomp", 'client-id' => 'stomp', 'clientID' => "stomp1", 'client_id' => "stomp2"} )
latter with:
@conn.subscribe(@destination, {"activemq.subscriptionName" => "stomp", :ack =>"client" })
Thanks to Calliope Sounds' Working Ruby + Stomp example blog entry, I finally managed to locate the last missing piece: the "client.join" which is necessary.
Just as a reference, here the stompcat utility as Durable topic subscriber:
#!/usr/bin/env ruby # # Copyright 2006 LogicBlaze Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # begin; require 'rubygems'; rescue; end require 'stomp' # # This simple script is inspired by the netcat utility. It allows you to receive # data from a stomp destination and output it. # # Usage: stompcat (destination-name) # # Example: stompcat /topic/foo # Would display output that arrives at the /topic/foo stomp destination # begin @port = 61613 @host = "localhost" @user = ENV["STOMP_USER"]; @password = ENV["STOMP_PASSWORD"] @host = ENV["STOMP_HOST"] if ENV["STOMP_HOST"] != nil @port = ENV["STOMP_PORT"] if ENV["STOMP_PORT"] != nil @destination = "/topic/default" @destination = $*[0] if $*[0] != nil $stderr.print "Connecting to stomp://#{@host}:#{@port} as #{@user}\n" # @conn = Stomp::Client.new(:login => @user, :passcode => @password, :host => @host, :port => @port, :headers => {'client-id' => 'stompcat'} ) @conn = Stomp::Connection.open(@user, @password, @host, @port, true, 5, {"client-id" => "stomp"} ) $stderr.print "Getting output from #{@destination}\n" @conn.subscribe(@destination, {"activemq.subscriptionName" => "stomp", :ack =>"client" }) while true @msg = @conn.receive $stdout.print @msg.body $stdout.print @msg.headers.inspect $stdout.print "\n" $stdout.flush @conn.ack @msg.headers["message-id"] end @conn.join rescue Exception => e p e end