如何停止/启动Spring DefaultMessageListenerContainer?

时间:2015-02-28 20:08:29

标签: spring spring-jms

我使用Spring JMS开发了一个项目来接收来自Queue的消息。它部署了Websphere应用服务器(WAS 7.5)集群环境。 它在服务器中部署后工作正常。后来我更新了我的记录器信息并部署到服务器中。似乎服务器没有选择最新的代码库。即使我已经停止/启动集群。

请参阅下面的配置xml。

<bean id="connectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
            <property name="hostName" value="${hostName}"/>
            <property name="port" value="${port}"/>
            <property name="queueManager" value="${queueManager}"/>
            <property name="transportType" value="${transportType}"/>
            <property name="channel" value="${channel}"/> 
   </bean>

   <jms:listener-container container-type="default"
connection-factory="connectionFactory" acknowledge="auto" concurrency="5" >
<jms:listener destination="DEV.TESTQUEUE" ref="jmsMessageListener" 
</jms:listener-container>

 <bean id="jmsMessageListener" class="JmsMessageListener"/>


      public class JmsMessageListener implements MessageListener { 

    public void onMessage(Message message) {

      }
    }
Could you please advise how to stop/start the container? 

2 个答案:

答案 0 :(得分:2)

这是我的解决方案:

final Map<String, DefaultMessageListenerContainer> containers = ctx.getBeansOfType(DefaultMessageListenerContainer.class);
        if (containers != null && !containers.isEmpty()) {
            for (DefaultMessageListenerContainer container : containers.values()) {
                container.stop();
            }
        }

答案 1 :(得分:1)

最后我找到了答案。

DMLC的默认执行程序是SimpleAsyncTaskExecutor。

SimpleAsyncTaskExecutor:此实现不重用任何线程,而是为每次调用启动一个新线程。  但是,它确实支持并发限制,该限制将阻止任何超出限制的调用,直到释放一个插槽。  如果您正在寻找真正的池,请继续向下滚动页面。 Spring Framework任务执行和调度。

所以线程继续在容器中运行。这是我的问题的根本原因。然后我重新启动了我的JVM(支持WAS Admin)并实现了ThreadPoolExecutor。

<jms:listener-container container-type="default"
connection-factory="connectionFactory" acknowledge="auto" concurrency="5" task-executor="taskExecutor">
<jms:listener destination="topCli_Service" ref="jmsMessageListener" 
</jms:listener-container>

<bean id="taskExecutor"
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="5" />
    <property name="maxPoolSize" value="10" />
    <property name="WaitForTasksToCompleteOnShutdown" value="true" />
</bean>