如何提高在Spring Boot中使用MQ JMS的效率 -Mark Taylor


Spring框架为Java程序使用各种接口提供了简单的方法。它的JMS组件包括一些类,这些类可帮助程序等待新消息,类似于消息驱动Bean。已知使用IBM MQ时,Spring实现的默认行为不是最佳的,我想提高效率。
本文显示了对Spring Boot和相应的MQ JMS Spring Boot组件的最新改进。他们消除了应用程序开发人员了解和编写代码以解决这种低效率的需求。
有关MQ Spring Boot Starter的更多信息,请参见本文

保罗写了关于轮询监听的行为的详细信息,这篇文章。但总而言之,使用Spring DefaultMessageListenerContainer实现轮询方法来接收JMS消息。本质上它在做:

 while (no message received) {
    MQGET(wait for receiveTimeout value)
    see if anything else needs to be done
  }

receiveTimeout设置了轮询循环有多快。该值对于处理到达的消息的响应速度无关紧要,无论设置参数多少,只要输入队列中有可用的消息,便会立即读取该消息。但是,将其设置为高值将意味着可能需要处理的其他事情(例如,Spring Framework可能正在寻找关闭请求)会延迟到计时器到期为止。因此,调值非常重要。缺省值为1秒,这可能意味着发出的MQGET数量远远超过期望的数量。

Spring Boot版本2.2.0以上半比可以为JMS侦听器设置外部计时参数:spring.jms.listener.receive-timeout=30s,在属性文件中设置。

MQ Spring Boot 2.2.0版将检测spring.jms.listener.receive-timeout是否存在外部属性配置,如果找到,则将使用新值。如果未设置,则该值将自动从1s更改为30s。当然,如果应用程序代码稍后再设置该值,则优先使用该值。

如果将Spring Boot与MQ JMS一起使用,则现在可以更好地利用MQ资源,而无需进行应用程序更改。现有应用程序仅通过使用当前版本的mq-jms-spring-boot-starter进行构建即可自动获得此增强。