【问题标题】:What is the difference between a MessageListener and a Consumer in JMS?JMS 中的 MessageListener 和 Consumer 有什么区别?
【发布时间】:2013-06-24 12:49:51
【问题描述】:

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

编辑:来自Javadoc of MessageListener

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

每个会话必须确保将消息串行传递给 听众。这意味着分配给一个或多个消费者的侦听器 同一个会话的可以假设onMessage方法没有被调用 直到会话完成最后一次调用为止。

所以我对异步串行这两个术语的用法感到困惑。这两个术语在描述MessageListener 的特性时有何关联?

【问题讨论】:

    标签: java jms messaging


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • @Evgeniy 在 AUTO_ACKNOWLEDGEMENT 模式下(非事务性) 如果在执行 receive()[synchronous] 方法或 onMessage()[aysnc] 方法时发生故障,消息会自动重新传递吗?链接:stackoverflow.com/questions/18712399/…
      【解决方案3】:

      来自docs

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

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

      【讨论】:

        猜你喜欢
        • 2019-09-04
        • 2017-06-20
        • 1970-01-01
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-25
        • 1970-01-01
        相关资源
        最近更新 更多