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
意味着什么?
答案 0 :(得分:2)
这可能是一个有点令人困惑的JMS。 Connection start仅指从连接消耗消息而不是生成消息。您可以随时随地生成消息,无论是否已启动,但如果您想要消费或浏览目的地,则需要启动连接,否则您将不会收到任何消息发送给您的消费者。
这背后的目的是允许您在接收任何消息之前创建所有JMS资源,否则这些消息可能会在您应用尚未准备好的状态下捕获您。
简而言之,如果要浏览该消息,则需要确保连接已启动。