0

当异常发生或 ActiveMQ 失败时,我的消费者,例如正在消费来自 ActiveMQ fromChannel 的消息的服务激活器应该重新启动。如何为以下 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 服务器关闭,我还希望接收器重新启动。

4

2 回答 2

3

当失去与代理的连接时,其中的侦听器容器message-driven-channel-adapter将自动继续尝试重新连接。

如果您设置 `acknowledge="transacted"',消息将在异常时回滚,并且代理将重新提交它。

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

于 2013-08-08T13:22:42.553 回答
1

看了你的帖子,瞬间想到了这个视频。这很好地了解了如何通过自身监控和控制 SI 应用程序。

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

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

按照您的想法利用Spring Retry在 SI 中的功能。

于 2013-08-08T13:06:13.833 回答