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

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

编辑:从MessageListener的Javadoc :

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

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

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

区别在于MessageConsumer用于同步接收消息:

 MessageConsumer mc = s.createConsumer(queue); Message msg = mc.receive(); 

对于异步传递,我们可以使用消息使用者注册MessageListener对象:

 mc.setMessageListener(new MessageListener() { public void onMessage(Message msg) { ... } }); 

来自文档 :

对于同步接收,客户端可以使用其接收方法之一从消息使用者请求下一条消息。

对于异步传递,客户端可以向消息使用者注册MessageListener对象。

根据我的知识,其他答案中没有说明的一个主要区别是MessageConsumer可以使用MessageSelectors ,因此能够使用它感兴趣的消息,而MessageListener将监听所有消息。

来自J2EE教程文档http://docs.oracle.com/javaee/5/tutorial/doc/bnceh.html

JMS消息选择器
如果您的消息传递应用程序需要过滤它收到的消息,您可以使用JMS API消息选择器,它允许消息使用者指定它感兴趣的消息。消息选择器将过滤消息的工作分配给JMS提供者而不是应用程序。