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

Kar*_*hik 2 spring message-queue spring-jms ibm-mq

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

我的应用程序运行在2个jvms上,这意味着每个jvm上有2个侦听器在监听同一个队列时处于活动状态.

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

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

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

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

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

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

Gar*_*ell 5

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

如果使用事务并将消息回滚到队列中; 无法保证同一个侦听器将获得重新传递的消息.