我有一个场景,我需要停止弹簧的DefaultMessageListenerContainer然后再启动它。我有10个不同的DefaultMessageListenerContainer监听10个不同的队列。 所有10个不同的容器都调用相同消息监听器类的相同方法。 现在我想根据onMessage方法中的异常停止特定队列的messagelistenercontainer。 请建议我如何实现上述方案。
以下是我的监听器配置
<bean id="msglistenerForAuditError" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsFactory"/>
<property name="sessionTransacted" value="true"/>
<property name="destinationName" value="test.audit.error2"/>
<property name="messageListener" ref="auditerrorListener" />
</bean>
<bean id="msglistenerForAuditEvent" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsFactory"/>
<property name="sessionTransacted" value="true"/>
<property name="destinationName" value="test.audit.event2"/>
<property name="messageListener" ref="auditerrorListener" />
</bean>
答案 0 :(得分:4)
DefaultMessageListenerContainer
是一个生命周期bean,因此它公开了一个start
和一个stop
方法,可以分别用来启动和停止监听器。
您可以自己构建一个服务,收集上下文中的所有已知实例,然后您可以循环使用这些服务来停止容器,例如
@Service
public class MyService {
private final Collection<DefaultMessageListenerContainer> containers;
@Autowired
public MyService(Collection<DefaultMessageListenerContainer> containers) {
this.containers = containers;
}
public void stopAll() {
// iterate over the collection and call "stop()" on each item
}
}
话虽如此:
答案 1 :(得分:2)
DefaultMessageListenerContainer上的stop方法没有用,但是shutdown方法工作得很好。
for(DefaultMessageListenerContainer defaultCont:containers){
defaultCont.shutdown();
}
答案 2 :(得分:0)
注入DefaultMessageListenerContainer的集合对我来说不起作用,我使用Spring Boot 1.4.x,Spring 4.3.x
以下是我如何解决它:
package org.example.queue;
import org.springframework.jms.config.JmsListenerEndpointRegistry;
//import other stuffs
@Component
public class QueueManager {
@Autowired
JmsListenerEndpointRegistry endpointRegistry;
public void shutdown() {
endpointRegistry.getListenerContainers().forEach((container) -> {
if (container.isRunning()) {
log.debug("Shutting down listener: " + container.getClass().getName());
container.stop();
}
});
}
public void start() {
endpointRegistry.getListenerContainers().forEach((container) -> {
if (!container.isRunning()) {
log.debug("Starting listener: " + container.getClass().getName());
container.start();
}
});
}
}