0

春の DefaultMessageListenerContainer を停止してから、後でもう一度開始する必要があるシナリオがあります。10 の異なるキューをリッスンする 10 の異なる DefaultMessageListenerContainer があります。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>
4

3 に答える 3

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. ユースケース全体が疑わしいように見えます。メッセージ リスナーは弾力性があり、さらに重要なことに、互いに独立している必要があります。リスナー B が例外をスローしたためにリスナー A を停止している場合、設計に間違いなく問題があります。
于 2014-07-29T13:52:26.077 に答える