【问题标题】:Spring JMS MessageListenerContainer recieving messages simultaneously?Spring JMS MessageListenerContainer同时接收消息?
【发布时间】:2013-06-07 10:43:40
【问题描述】:

我想知道如果指向一个主题的 MessageListenerContainer 同时收到 2 条(或更多)消息会发生什么。

例如,应用的 2 位用户同时触发发布,因此 2 个 jmstemplate 调用向同一主题发送 2 条不同的消息。

容器将如何处理这个问题?

  1. 容器会创建 2 个线程同时调用 MessageListenerAdapter(应该实现为线程安全的)吗?
  2. 或者 容器 是否只有 1 个线程依次调用 MessageListenerAdapter

【问题讨论】:

    标签: java jms mq spring-jms


    【解决方案1】:

    并发 设置控制有多少侦听器同时使用消息。主题的消费者不能超过 1 个,否则同一节点上的消息可能会被消费两次。

    <jms:listener-container
      container-type="default"
      connection-factory="connectionFactory"
      acknowledge="auto"
      concurrency="1"     
      cache="consumer">
      <jms:listener destination="TEST.FOO" 
                    ref="simpleMessageListener"
                    method="onMessage" />
    </jms:listener-container>
    

    也看到这个... https://stackoverflow.com/a/5808803/791406

    春季文档... http://static.springsource.org/spring/docs/3.0.5.RELEASE/api/org/springframework/jms/listener/DefaultMessageListenerContainer.html

    【讨论】:

    • 感谢您的回复。但是如果我将并发设置为 1,这是否意味着容器/适配器同时接收到的 2 条消息将被串行处理,而不是并行处理?
    • 是的,对于每个节点有 1 个侦听器的主题,将串行处理 2 条单独的消息。如果为同一个主题设置concurrency &gt; 1,则每个监听器都会并行处理相同的消息;这对话题毫无意义。你的用例是什么?消息中的内容是什么?如果是新闻广播或类似内容,请使用主题,但如果您需要对任何唯一消息(例如客户采购订单)进行一次性处理,请使用队列并设置 concurrency &gt; 1 以并行处理许多消息。跨度>
    猜你喜欢
    • 2011-12-12
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2021-06-16
    • 2017-08-09
    • 2012-01-19
    • 2020-11-16
    相关资源
    最近更新 更多