高Spring JMS DefaultMessageListenerContainer.receiveTimeout参数的含义是什么?

时间:2016-08-03 14:48:02

标签: spring-jms

我正在进入一个实现IBM MQ侦听Spring JMS应用程序的项目,我很难理解DefaultMessageListenerContainer中的“receiveTimeout”。

与来自互联网的消息来源相比,我认为我的项目有点特别,我们使用30秒的“receiveTimeout”参数非常高,我不知道这实际意味着什么。

我试图弄清楚“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的行为。

1 个答案:

答案 0 :(得分:3)

当询问代理客户端是否有更多工作(receive())时,使用接收超时 - 它不轮询代理,只是轮询客户端库以查看代理是否已发送更多信息消息。它与收到消息的频率无关。

当超时发生时,容器会立即再次调用receive()

高接收超时意味着容器对stop()次来电的响应速度较慢 - 容器只能在receive()次来电之间停止。