【发布时间】:2016-12-09 08:55:41
【问题描述】:
我正在进入一个实现 IBM MQ 侦听 Spring JMS 应用程序的项目,但我无法理解 DefaultMessageListenerContainer 中的“receiveTimeout”。
与来自互联网的资源相比,我认为我的项目有点特别,我们为“receiveTimeout”参数使用了一个非常高的 30 秒值,我不知道这实际上意味着什么。
我已经尝试弄清楚“receiveTimeout”参数的含义,在Spring配置之后我将在下面给你我的理解。
仅供参考:我们正在从一个队列中读取/处理许多非常小的消息(大约 100kb)。
这是我们正在使用的弹簧配置:
<bean id="msgListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer"
p:connectionFactory-ref="mqConnectionFactory"
p:messageListener-ref="myMessageListener" p:sessionTransacted="true"
p:concurrentConsumers="1" p:maxConcurrentConsumers="20"
p:receiveTimeout="30000" p:idleTaskExecutionLimit="10"
p:idleConsumerLimit="5" />
如果有人想知道这里的不同参数是我在互联网上收集的:
idleConsumerLimit 属性用于指定最大值 在给定时间允许空闲的消费者数量。 增加此限制会导致更积极地创建调用程序。 这对于更快地增加消费者数量很有用。
idleTaskExecutionLimit:允许的空闲次数限制 接收任务的执行。默认为 1 导致资源空闲 一旦任务没有收到消息就提前关闭。 idleTaskExecutionLimit 属性设置为 10 以允许任务执行 10 次,而不是默认值 1。
receiveTimeout 属性设置为 30 秒以告知 DMLC 接收操作轮询消息 30 秒,而不是 默认一秒。
这是我的理解:
所以这意味着:如果负载很重,Spring JMS 最多会启动 20 消费者(maxConcurrentConsumers),一旦负载下降,这些消费者将 在关闭或空闲之前继续阅读消息 30 秒 (receiveTimeout)。 所以在那之后5个消费者(idleConsumerLimit)仍然会空闲10秒(?)(idleTaskExecutionLimit)之前 倒闭。
如果我错了,请纠正我。
一个网页说我的消费者每 30 秒只会阅读一条消息,但我认为这不是对“receiveTimeout”的正确解释。
我们目前遇到的一个问题是,我们从 MQ 读取了很多 GET,但实际上并没有收到消息 - 就像我们可以有 60'000 个 GET 实际能够读取消息,而 2'100'000 GET 发生但没有读取消息。
感谢任何帮助我更好地理解 Spring JMS 的行为。
【问题讨论】:
标签: spring-jms