单点对点队列和多个侦听器

时间:2012-11-07 21:40:47

标签: spring message-queue ibm-mq spring-jms

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

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

回答我的问题,如果收到消息......

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

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

3)我可以为单个队列扩展到'N'个侦听器吗?如果我成长为10个听众,缩放是如何工作的?如何将消息分发给听众?

4)MQ服务器如何确保不向多个侦听器发送相同的消息?

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

1 个答案:

答案 0 :(得分:5)

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