具有特定重试计数的DefaultMessageListenerContainer recoveryInterval

时间:2015-08-28 09:22:56

标签: spring spring-integration spring-jms

我们在项目中使用Spring Integration,我们有一个要求,如果IBM MQ出现问题,那么我们将不得不在IBM MQ启动时自动连接到它。我们使用recoveryInterval类的org.springframework.jms.listener.DefaultMessageListenerContainer选项完成了此实现。我们已经将恢复间隔设置为6秒,因此每6秒系统尝试恢复MQ连接,但现在我们有一个要求,我们必须只执行两次自动恢复,之后如果MQ仍然关闭则停止入站适配器。 Spring Integration中是否有任何方法可以提及自动恢复重试次数,以便系统只尝试恢复该重试次数?

以下是我现有的配置。

<bean id="inQ" class="com.ibm.mq.jms.MQQueue">
<constructor-arg value="${mq.inbound.queue}" />
</bean>
<int:channel id="inbound" />
<int-jms:message-driven-channel-adapter
    id="jmsIn" channel="inbound" container="messageListenerContainer"
    acknowledge="transacted" auto-startup="false">
</int-jms:message-driven-channel-adapter>

<int:service-activator id="mainService"
    input-channel="inbound" ref="messageListener" method="onMessage">
    <int:request-handler-advice-chain>
        <ref bean="retryWithBackoffAdviceSession" />
    </int:request-handler-advice-chain>
</int:service-activator>

<bean id="messageListenerContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="mqConnectionFactory" />
    <property name="destination" ref="inQ" />
    <property name="sessionTransacted" value="true" />
    <property name="maxConcurrentConsumers" value="${maxConcurrentConsumers}" />
    <property name="concurrentConsumers" value="${concurrentConsumers}" />
    <property name="receiveTimeout" value="${receiveTimeout}" />
    <property name="recoveryInterval" value="60000" />
    <property name="autoStartup" value="${autoStartup}" />
</bean>

由于 SACH

1 个答案:

答案 0 :(得分:0)

作为recoveryInterval的替代方法,您现在可以指定Backoff(请参阅docs)。

它不提供停止容器的机制,但适当的退避可以有效地做你想要的。

然后,您需要以编程方式停止/开始再次启动它。