15

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

编辑:来自MessageListener 的 Javadoc

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

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

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

4

3 回答 3

21

不同的是 MessageConsumer 用于同步接收消息:

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

对于异步传递,我们可以向消息消费者注册一个 MessageListener 对象:

mc.setMessageListener(new MessageListener() {
    public void onMessage(Message msg) {
        ...
    }
});
于 2013-06-27T06:40:11.367 回答
10

来自文档

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

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

于 2013-06-27T06:40:02.403 回答
3

据我所知,在其他答案中未说明的一个主要区别是 MessageConsumer 可以利用MessageSelectors并因此能够使用它感兴趣的消息,并且MessageListener可以收听所有消息。

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

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

于 2014-12-11T08:43:59.043 回答