我的消费者,例如消除来自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服务器关闭,我也希望接收器重启。
答案 0 :(得分:3)
message-driven-channel-adapter
内的侦听器容器在失去与代理的连接时会自动继续尝试重新连接。
如果设置'acknowledge =“transacted”',则会在异常时回滚该消息,并且代理将重新提交该消息。
有状态重试建议允许您在经过一些重试后放弃并采取其他一些操作(但您也可以将其配置到ActiveMQ本身,它将在一定次数的传递尝试后将消息发送到DLQ)。
答案 1 :(得分:1)
阅读你的帖子我立刻想到了this video。这样就可以很好地了解如何通过自身监控和控制SI应用程序。
此外,您应该查看SI的ApplicationEvent文档。
将所有内容粘合在一起,您可以使用JMX监视JMS消息适配器,并通过在问题上发送ApplicationEvent来停止并重新启动它。关于捕获异常,取决于您实际想要处理的异常。我创建了一个errorChannel,它接收组件抛出的异常并创建一个新服务,在收到错误后重新启动这些组件。
根据你的想法,在SI中利用Spring Retry的能力。