2

我有一个“点对点”IBM MQ 队列接收来自多个生产者的消息。我的应用程序使用队列中的消息。我正在使用 spring 'jmstemplate" 和 "DefaultMessageListenerContainer" 来异步使用消息。

我的应用程序在 2 个 jvm 上运行,这意味着每个 jvm 上有 2 个活动的侦听器正在侦听同一个队列。

来回答我的问题,如果有消息...

1) 侦听器如何知道消息到达队列?

2)在两个听众中,哪一个会收到消息?将消息分发给听众的方法是什么?

3) 我可以将单个队列的听众数量扩展到“N”个吗?如果我增长到 10 个听众,缩放是如何工作的?消息是如何分发给听众的?

4) MQ 服务器如何确保同一条消息不会发送到多个监听器?

可能这些都是简单的问题,但无法深入了解上述场景的工作原理。请分享你的想法...

4

1 回答 1

5
  1. 这是 IBM 客户端库的一个功能;侦听器容器只是轮询 JMS API 以等待消息;默认情况下,它使用 1 秒的接收超时;使用 TRACE 级别的日志记录,您将看到显示此活动的日志消息。可以通过在容器上设置 receiveTimeout 来修改超时。
  2. 从客户的角度来看,这是不确定的;IBM 经纪人知道有多少消费者注册并选择了一个。一些代理允许配置预取;这有助于提高音量下的性能,但会损害低音量下的性能。
  3. 是的; Spring Listener Container 可以根据负载动态扩展监听器;您可以配置最小/最大消费者,Spring 将根据需要在这些范围内进行调整。就代理而言,每个侦听器都是一个单独的消费者,因此工作是根据代理的算法分配的。
  4. 这是 IBM 代理的功能(也是 JMS 合同的一部分)。

如果使用事务并且消息回滚到队列中;不能保证同一个侦听器会收到重新传递的消息。

于 2012-11-07T23:04:39.030 回答