Spring-Integration默认重试配置

时间:2017-05-10 07:00:30

标签: spring-integration

我有一个弹簧集成项目,它执行以下操作

1.) Read messages from a queue
2.) Transform messages
3.) Send transformed messages to an Api

第1步的相关配置

<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="MQConnectionFactory" />
    <property name="sessionCacheSize" value="10"/>
</bean>


<bean id="requestQueue" class="com.ibm.mq.jms.MQQueue">
    <constructor-arg index="0" value="${queuemanager}"/>
    <constructor-arg index="1" value="${incoming.queue}"/>
</bean>


<integration:poller id="poller" default="true" fixed-delay="1000"/>

<jms:message-driven-channel-adapter id="jmsIn"
        destination="requestQueue"
        channel="inputJsonConversionChannel" 
        connection-factory="cachingConnectionFactory" />

步骤3是服务激活器,如果发生故障(不是201 HTTP状态),我会抛出一个自定义异常。

第3步的相关配置

<int:service-activator input-channel="ApiChannel" ref="EventApiClient" method="post"/>

<int:service-activator input-channel="errorChannel" ref="PListenerExceptionHandler" method="handleFailure"/>

发生的行为是,它不断尝试连接并一遍又一遍地获得相同的错误。

我想知道是否有人可以向我解释

  • 如何配置/触发此默认重试?

  • 如何将错误重定向到错误通道,因为现在步骤1中的错误使用全局错误通道和我创建的默认错误处理程序。但服务激活器的错误不是。

干杯

克里斯

1 个答案:

答案 0 :(得分:0)

它正在重试,因为默认情况下消息驱动的通道适配器是事务性的,这意味着异常会导致消息回滚到队列中。

您可以向适配器添加error-channel,任何例外情况都会以ErrorMessage的形式发送,其中有效负载MessagingException具有属性failedMessage和{ {1}}。

如果错误通道下游的集成流“消耗”错误,则将提交事务并删除消息。如果错误流引发异常,则事务将像以前一样回滚。

默认情况下,默认cause只会记录异常。

errorChannel

或者您可以使用自定义渠道并将自己的逻辑放入该渠道的订阅者中。

相关问题