【问题标题】:JMS ActiveMQ createBrowser always returns empty queueJMS ActiveMQ createBrowser 总是返回空队列
【发布时间】:2015-02-05 00:52:11
【问题描述】:

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

更新:execute 有一个尚未详细记录的参数boolean startConnection。当它设置为“true”时,它似乎工作。虽然这不是一个解决方案 -

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 是什么意思吗?

【问题讨论】:

  • startConnection 设置为 true 也解决了我的问题。

标签: spring jms activemq


【解决方案1】:

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

这背后的目的是允许您在接收任何消息之前创建所有 JMS 资源,否则这些消息可能会导致您的应用程序尚未完全准备好它们。

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

【讨论】:

  • 谢谢@Tim。有道理。所以发消息的时候就不能用Session浏览队列了?
  • 除非你启动它。
猜你喜欢
  • 2012-06-13
  • 2017-05-22
  • 2016-05-27
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 2018-06-14
  • 1970-01-01
相关资源
最近更新 更多