1
votes

ActiveMQ 5.10.0 Spring 4.1.2

I'm using Spring to access activeMQ and trying to peek at the queue before adding a new message onto the queue. The message is added successfully, but it does not show anything in the queue. Through the web interface, I see my messages are pending in the queue.

Thanks!

@Service
public class MessageQueueService{

    private static final Logger logger = LoggerFactory.getLogger(MessageQueueService.class);

    @Inject
    JmsTemplate jmsTemplate;

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void testAddJob(){

        jmsTemplate.send(new MessageCreator() {

            public Message createMessage(Session session) throws JMSException {
                IndexJob j1=new IndexJob();
                j1.setOperation("post");
                ObjectMessage om=session.createObjectMessage();
                om.setObject(j1);
                QueueBrowser qb=session.createBrowser((javax.jms.Queue) jmsTemplate.getDefaultDestination());
                Enumeration<Message> messages=qb.getEnumeration();
                logger.info("browsing "+qb.getQueue().getQueueName());
                int i=0;
                while(messages.hasMoreElements()) {
                    i++;
                    Message message=messages.nextElement();
                    logger.info(message+"");
                }
                logger.info("total record:"+i);
                return om;
            }

        });

}

output:

2014-12-07 00:03:43.874 [main] INFO c.b.b.s.MessageQueueService - browsing indexJob 2014-12-07 00:03:43.878 [main] INFO c.b.b.s.MessageQueueService - total record:0

UPDATE: execute has a not yet well-documented parameter boolean startConnection. When it is set to "true", it seem to work. This is not a solution though -

String result=jms.execute(new SessionCallback<String>() {

            @Override
            public String doInJms(Session session) throws JMSException {
                QueueBrowser queue=session.createBrowser((Queue)session.createQueue("indexJob"));
                Enumeration<Message> messages=queue.getEnumeration();
                String result="";
                logger.info("Browse Queue: "+queue.getQueue().getQueueName());
                while(messages.hasMoreElements()) {
                    Message message=messages.nextElement();
                    result+=message;
                }
                logger.info(result);
                return result;
            }

        }, true);

Looking at org.springframework.jms.core.JmsTemplate.class source, most of the send methods are using execute() method with startConnection=false.

If the connection was not started, then how did the messages get added to the queue?

Does anyone know what this @param startConnection whether to start the Connection means?

1
setting startConnection to true solved my problem as well.Maciej Miklas

1 Answers

2
votes

This can be a somewhat confusing bit of JMS. The Connection start only refers to consumption of messages from the connection, not to producing. You are free to produce messages whenever you like, started or not, but if you want to consume or browse a destination you need to start the connection otherwise you will not get any messages dispatched to your consumers.

This purpose behind this is to allow you to create all your JMS resources prior to receiving any messages which might otherwise catch you in an state where you app isn't quite ready for them.

So in short, if you want to browse that message, you need to ensure the connection gets started.