JMS ActiveMQ createBrowser始终返回空队列

时间:2014-12-07 05:12:14

标签: spring jms activemq

ActiveMQ 5.10.0 春季4.1.2

我使用Spring访问activeMQ并尝试在向队列添加新消息之前查看队列。消息已成功添加,但它不会显示队列中的任何内容。通过Web界面,我看到我的消息在队列中待处理。

谢谢!

@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;
            }

        });

}

输出:

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有一个尚未记录良好的参数boolean startConnection。当它设置为&#34; true&#34;时,它似乎有效。这不是解决方案 -

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);

查看org.springframework.jms.core.JmsTemplate.class来源,大多数发送方法都使用execute()方法startConnection = false。

如果没有启动连接,那么消息是如何添加到队列的?

有谁知道这个@param startConnection whether to start the Connection意味着什么?

1 个答案:

答案 0 :(得分:2)

这可能是一个有点令人困惑的JMS。 Connection start仅指从连接消耗消息而不是生成消息。您可以随时随地生成消息,无论是否已启动,但如果您想要消费或浏览目的地,则需要启动连接,否则您将不会收到任何消息发送给您的消费者。

这背后的目的是允许您在接收任何消息之前创建所有JMS资源,否则这些消息可能会在您应用尚未准备好的状态下捕获您。

简而言之,如果要浏览该消息,则需要确保连接已启动。