小编Inv*_*est的帖子

Spring JMS DefaultMessageListenerContainer.receiveTimeout高参数意味着什么?

我正在进入一个实现IBM MQ侦听Spring JMS应用程序的项目,并且在理解DefaultMessageListenerContainer中的“ receiveTimeout”时遇到了麻烦。

与Internet上的来源相比,我认为我的项目有点特殊,我们为“ receiveTimeout”参数使用了非常高的30秒值,我不知道这实际上意味着什么。

我试图弄清楚“ receiveTimeout”参数的含义,在Spring配置之后,我将在下面提供您的理解。

仅供参考:我们正在从队列中读取/处理许多非常小的消息(大约100kb)。

这是我们正在使用的spring配置:

<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" />
Run Code Online (Sandbox Code Playgroud)

如果有人想知道不同的参数,这就是我在整个互联网上收集到的信息:

idleConsumerLimit属性用于指定消费者被允许被闲置在给定时间的最大数量。增加此限制会导致更积极地创建调用程序。这对于加快消费者数量很有用。

idleTaskExecutionLimit:接收任务允许的空闲执行次数的限制。缺省值为1,导致一旦任务未收到消息,空闲资源将尽早关闭。idleTaskExecutionLimit属性设置为10,以允许任务执行10次,而不是默认值1。

receiveTimeout属性设置为30秒,以告知DMLC的接收操作轮询消息30秒,而不是默认的1秒。

这是我的理解:

因此,这意味着:如果负载很大,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

6
推荐指数
1
解决办法
3953
查看次数

标签 统计

spring-jms ×1