我是JMS
的新手。据我所知, Consumers
能够从队列/主题中选择消息。那么为什么你需要 MessageListener
,因为 Consumers
会知道他们什么时候收到邮件?这样的 MessageListener
的实际用途是什么?
修改:来自Javadoc of MessageListener:
MessageListener对象用于异步传递 消息。
每个会话必须确保它将消息串行传递给 监听器。这意味着分配给一个或多个消费者的监听器 同一会话可以假定未调用onMessage方法 使用下一条消息,直到会话完成最后一次通话。
所以我对术语异步和串行的使用感到困惑。这两个术语在描述MessageListener
的特征时是如何相关的?
答案 0 :(得分:20)
不同之处在于MessageConsumer用于同步接收消息:
MessageConsumer mc = s.createConsumer(queue);
Message msg = mc.receive();
对于异步传递,我们可以使用消息使用者注册MessageListener对象:
mc.setMessageListener(new MessageListener() {
public void onMessage(Message msg) {
...
}
});
答案 1 :(得分:10)
来自docs:
对于同步接收,客户端可以使用其接收方法之一向消息使用者请求下一条消息。
对于异步传递,客户端可以向消息使用者注册 MessageListener 对象。
答案 2 :(得分:3)
根据我的知识,其他答案中没有说明的一个主要差异是MessageConsumer可以使用MessageSelectors
,因此能够使用它感兴趣的消息,其中MessageListener
会听取所有信息。
来自J2EE教程文档http://docs.oracle.com/javaee/5/tutorial/doc/bnceh.html
JMS消息选择器
如果您的消息传递应用程序需要过滤它收到的消息,您可以使用JMS API消息选择器,它允许消息使用者指定它感兴趣的消息。消息选择器将过滤消息的工作分配给JMS提供者而不是申请。