MessageListener和JMS中的Consumer之间有什么区别?

时间:2013-06-27 06:30:58

标签: java jms messaging

我是JMS的新手。据我所知, Consumers 能够从队列/主题中选择消息。那么为什么你需要 MessageListener ,因为 Consumers 会知道他们什么时候收到邮件?这样的 MessageListener 的实际用途是什么?

修改:来自Javadoc of MessageListener

  

MessageListener对象用于异步传递   消息。

     

每个会话必须确保它将消息串行传递给   监听器。这意味着分配给一个或多个消费者的监听器   同一会话可以假定未调用onMessage方法   使用下一条消息,直到会话完成最后一次通话。

所以我对术语异步串行的使用感到困惑。这两个术语在描述MessageListener的特征时是如何相关的?

3 个答案:

答案 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提供者而不是申请。