DefaultMessageListenerContainer间歇性地使用消息

时间:2013-05-17 16:08:28

标签: spring jms spring-jms

我有以下配置来消耗队列中的消息。我需要确保任务执行程序一次只能执行一个任务,因此我也按如下方式配置了任务执行程序。

<bean name="jmsTaskExecutor"
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="1" />
    <property name="maxPoolSize" value="2" />
</bean>

当我如上配置我的任务执行程序时,一次消耗10条消息(队列中有大量消息),容器停止侦听消息大约10-15分钟。我的容器配置为如下:

<bean id="queueContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="cachedConnectionFactory" />
    <property name="destination" ref="queue" />
    <property name="maxConcurrentConsumers" value="1" />
    <property name="idleTaskExecutionLimit" value="1" />
    <property name="idleConsumerLimit" value="5" />
    <property name="receiveTimeout" value="10000" />
    <property name="recoveryInterval" value="10000" />
    <property name="taskExecutor" ref="jmsTaskExecutor" />
    <property name="messageListener" ref="queueListener" />
    <property name="autoStartup" value="true" />
</bean>

在做了一点谷歌搜索之后,我尝试使用SyncTaskExecutor而不是ThreadPoolTask​​Executor,我已按如下方式配置了我的taskExecutor:

<bean name="jmsTaskExecutor"
            class="org.springframework.core.task.SyncTaskExecutor" />

但是这会导致tomcat中出现内存泄漏。

请告诉我如何在任务完成后才能实现消费消息和处理消息的行为?

队列侦听器代码如下:

public class QueueListener implements SessionAwareMessageListener<Message>{
 @override
 public void onMessage(Message msg,Session ses) throws JMSException{
 ....
 ....
 ....
 }
}

1 个答案:

答案 0 :(得分:0)

  

当我如上配置我的任务执行程序时,一次消耗10条消息

这表明您的预取大小为10。 因此,即使您只有一个线程处理消息,该线程一次也会接收10条消息。如果您以预取大小0或1启动代理(取决于代理实现),您将一次获得一条消息&#34;你想要的行为。

对于ex,如果您使用的是ActiveMQ,则可以在设置预取大小时查看此link

如果您的消息处理需要时间,那么我们需要查看更多您的消息&#34; onMessage&#34;代码告诉你可能花时间在哪里。