キューからメッセージを消費するための次の構成があります。タスク エグゼキューターが一度に 1 つのタスクのみを実行するようにする必要があるため、タスク エグゼキューターも次のように構成しました。
<bean name="jmsTaskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="1" />
<property name="maxPoolSize" value="2" />
</bean>
タスク Executor を上記のように構成すると、一度に 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>
少しグーグルで調べた後、ThreadPoolTaskExecutor の代わりに 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{
....
....
....
}
}