我使用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?
答案 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>