2013-05-17 57 views
1

我具有以下配置以消耗隊列中的消息。我需要確保任務執行程序一次只執行一項任務,因此我也按以下方式配置了任務執行程序。DefaultMessageListenerContainer間歇地消費消息

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

當我配置如上我的任務執行,10條消息得到在同一時間(有消息隊列中有巨大的流量)消耗和容器停止偵聽消息幾乎10-15 minutes.My容器配置如下:

<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> 

做谷歌搜索一點點後,我試圖用的,而不是ThreadPoolTask​​Executor類和SyncTaskExecutor,我已經配置如下我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{ 
.... 
.... 
.... 
} 
} 
+0

你可以發佈你的queueListener代碼嗎?還發布剩餘的XML配置?預取大小是多少? – brainOverflow

+0

我沒有明確地設置預取大小,我發佈了我的queueListener代碼。你可以請現在檢查嗎? –

回答

0

當我配置如上我的任務執行,10條消息得到一次

這表明你的預取大小是消耗因此,即使你只有一個線程處理消息,該線程一次只能處理10條消息。如果以預取大小爲0或1(取決於代理實施)啓動代理,您將獲得所需的「一次一條消息」行爲。

例如,如果您使用ActiveMQ,您可以在設置預取大小時查看此link

如果您的郵件處理需要時間,那麼我們需要查看更多的「onMessage」代碼,以告訴您可能要花費多少時間。