停止 spring jms 消息监听器

vas*_*hth 1 spring jmstemplate spring-jms

我有一个场景,我需要停止 spring 的 DefaultMessageListenerContainer,然后再次启动。我有 10 个不同的 DefaultMessageListenerContainer 监听 10 个不同的队列。所有 10 个不同的容器都调用相同消息侦听器类的相同方法。现在我想根据 onMessage 方法中出现的异常停止特定队列的消息侦听器容器。请建议我如何实现上述场景。

下面是我的监听器配置

<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>
Run Code Online (Sandbox Code Playgroud)

Ste*_*oll 5

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
    }
}
Run Code Online (Sandbox Code Playgroud)

话虽如此:

  1. 您不应该调用此服务作为消息侦听器的一部分,因为在线程处理消息时尝试停止容器会产生奇怪的副作用
  2. 整个用例对我来说看起来很可疑。您的消息侦听器应该具有弹性,更重要的是,它们应该彼此独立;如果你因为监听器 B 抛出异常而停止监听器 A,那么你的设计肯定有问题