如何在Spring Integration中重新启动消息使用者?

时间:2013-08-08 11:06:52

标签: spring asynchronous activemq messaging spring-integration

我的消费者,例如消除来自ActiveMQ fromChannel的消息的服务激活器应在异常发生或ActiveMQ失败时重新启动。如何为以下Spring集成上下文做到这一点?

 <!-- RECEIVER. message driven adapter -> jmsInChannel -> activator. -->

<si:channel id="fromChannel"/>

<int-jms:message-driven-channel-adapter id="messageDrivenAdapter"
    channel="fromChannel" destination="forward" connection-factory="connectionFactory"
    max-concurrent-consumers="2" auto-startup="true" acknowledge="auto" extract-payload="false" />

<si:service-activator id ="activator" 
    input-channel="fromChannel"
    ref="messageService" 
    method="process"/>

<bean id="messageService" class="com.ucware.ucpo.forward.jms.MessageService"/>

我的第一个想法是使用Retry Advice并添加到服务但不确定这是否是未处理异常的正确解决方案。如果ActiveMQ服务器关闭,我也希望接收器重启。

2 个答案:

答案 0 :(得分:3)

message-driven-channel-adapter内的侦听器容器在失去与代理的连接时会自动继续尝试重新连接。

如果设置'acknowledge =“transacted”',则会在异常时回滚该消息,并且代理将重新提交该消息。

有状态重试建议允许您在经过一些重试后放弃并采取其他一些操作(但您也可以将其配置到ActiveMQ本身,它将在一定次数的传递尝试后将消息发送到DLQ)。

答案 1 :(得分:1)

阅读你的帖子我立刻想到了this video。这样就可以很好地了解如何通过自身监控和控制SI应用程序。

此外,您应该查看SI的ApplicationEvent文档。

将所有内容粘合在一起,您可以使用JMX监视JMS消息适配器,并通过在问题上发送ApplicationEvent来停止并重新启动它。关于捕获异常,取决于您实际想要处理的异常。我创建了一个errorChannel,它接收组件抛出的异常并创建一个新服务,在收到错误后重新启动这些组件。

根据你的想法,在SI中利用Spring Retry的能力。