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

Gee*_*eek 14 java messaging jms

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

编辑:从MessageListenerJavadoc:

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

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

所以我在异步串行一起使用术语时感到困惑.这两个术语在描述特征方面MessageListener有何关联?

Evg*_*eev 21

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

MessageConsumer mc = s.createConsumer(queue);
Message msg = mc.receive();
Run Code Online (Sandbox Code Playgroud)

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

mc.setMessageListener(new MessageListener() {
    public void onMessage(Message msg) {
        ...
    }
});
Run Code Online (Sandbox Code Playgroud)


wrm*_*wrm 10

来自文档:

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

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


mtk*_*mtk 5

据我所知,其他答案中未提及的一个主要区别是 MessageConsumer 可以利用MessageSelectors,因此有能力消费它感兴趣的消息,并MessageListener监听所有消息。

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

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