【问题标题】:What happens when there are more than one @JmsListener in an application? (in terms of concurrency)当应用程序中有多个 @JmsListener 时会发生什么? (在并发方面)
【发布时间】:2020-09-24 18:59:54
【问题描述】:

我正在尝试使用 JMS 使用来自三个 IBM MQ 队列的消息。

所以,我的 Spring Boot 应用程序中有三个 @JmsListener。

我对此表示怀疑,如果所有消费者都可以从各自的队列中消费,他们将如何表现。

  • 会有并发吗?
  • 如果不是从队列中并发消费的最佳方式是什么,因为我负担不起应用程序的串行执行。

提前致谢:)

【问题讨论】:

    标签: spring spring-boot jms ibm-mq


    【解决方案1】:

    在 JmsListener 注解上可以设置并发行为:

    并发

    公共抽象字符串并发

    侦听器的并发限制(如果有)。覆盖值 由用于创建侦听器的容器工厂定义 容器。并发限制可以是“上下”字符串——对于 例如,“5-10”——或简单的上限字符串——例如,“10”, 在这种情况下,下限为 1。

    请注意,底层容器可能支持也可能不支持所有 特征。例如,它可能无法扩展,在这种情况下 只使用上限。

    来源:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/annotation/JmsListener.html#concurrency--

    每个监听器都在自己的线程中运行。

    您可以通过打印收到的消息轻松地对此进行测试。这将输出它运行的线程。例如:

    2020-06-06 11:26:54.339  INFO 23404 --- [enerContainer-1] c.e.d.ShippingService                    : Hello World!
    

    线程名称是[enerContainer-1]

    请阅读更多关于 Spring 和 JMS 的文档https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#jms-receiving

    【讨论】:

    • 这个设置不只是表示单个队列的onM​​essage方法发送了多少消息吗?我认为问题是如果 3 个不同的队列上有 3 个不同的侦听器,这三个队列是同时读取还是串行读取?我认为它是并发的,但不是 Spring 出口。
    • 啊,我明白了。每个侦听器都在自己的线程中运行。所以是的,它是并发的
    • 感谢您的确认,我相信您是一位弹簧专家,而不是我的“弹簧出口”:)。你会用这些细节更新你的答案吗?
    • 添加了如何检查监听器是否在线程中运行的信息
    • 感谢@SimonMartinelli 回答我的问题,您的第一个回答(容器内的并发)也很有帮助。
    猜你喜欢
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多