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

17

我对 JMS 不熟悉。据我所知,消费者(Consumers)可以从队列/主题中获取消息。那么为什么需要 MessageListener 呢?因为消费者已经知道何时获取了消息。这个 MessageListener 的实际用途是什么?

编辑:根据 MessageListener 的 Javadoc

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

每个会话必须确保将消息按序传递给监听器。这意味着分配给同一会话的一个或多个消费者的监听器可以假定在会话完成上次调用之前不会使用下一个消息调用 onMessage 方法。

因此,我对 “异步” 和 “按序” 这两个术语的使用感到困惑。这两个术语如何描述 MessageListener 的特性?

3个回答

24

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

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

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

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

在AUTO_ACKNOWLEDGEMENT模式(非事务性)下,如果在执行receive()[同步]方法或onMessage()[异步]方法时发生故障,则消息会自动重新传递。链接:http://stackoverflow.com/questions/18712399/auto-acknowledgement-modenon-transactional-receive-vs-onmessage - lowLatency

11

来自文档:

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

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

(说明:该段落介绍了Java JMS中的消息消费者如何进行同步和异步消息接收。同步接收可以通过调用接收方法获取下一条消息;异步接收可以通过注册一个MessageListener对象来实现。)

4
据我所知,一个主要的区别是MessageConsumer可以利用MessageSelectors,因此具有消耗其感兴趣的消息的能力,而MessageListener将监听所有消息。
来自J2EE教程文档http://docs.oracle.com/javaee/5/tutorial/doc/bnceh.html JMS消息选择器 如果您的消息应用程序需要过滤它接收到的消息,则可以使用JMS API消息选择器,它允许消息消费者指定它感兴趣的消息。消息选择器将过滤消息的工作分配给JMS提供者,而不是应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接