【发布时间】:2021-04-20 13:16:18
【问题描述】:
下面是配置
<jms:outbound-channel-adapter id="someId" channel="inputChannel"
connection-factory="${connection.factory}" destination="queue">
<jms:request-handler-advice-chain>
<bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
<property name="onSuccessExpression" value="T(Boolean).TRUE"/>
<property name="successChannelName" value="afterSuccessDeliveryMessageChannel"/>
<property name="onFailureExpression" value="T(Boolean).FALSE"/>
<property name="failureChannelName" value="failureChannel"/>
</bean>
<bean id="retryWithBackoffAdviceSession"
class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice">
<property name="retryTemplate">
<bean class="org.springframework.retry.support.RetryTemplate">
<property name="retryPolicy">
<bean class="org.springframework.retry.policy.SimpleRetryPolicy">
<property name="maxAttempts" value="5"/>
</bean>
</property>
</bean>
</property>
<property name="recoveryCallback">
<bean class="org.springframework.integration.handler.advice.ErrorMessageSendingRecoverer">
<constructor-arg ref="failureChannel"/>
</bean>
</property>
</bean>
</jms:request-handler-advice-chain>
</jms:outbound-channel-adapter>
我正在重试消息 5 次,然后使用 recoveryCallBack 将消息记录到某个数据库。 它工作正常,重试 5 次并调用 failureChannel 频道,但一旦调用 failureChannel,它就会再次传递给 afterSuccessDeliveryMessageChannel。
我不确定我在这里做错了什么? 我预计一旦失败,它应该会返回 failedChannel 而不是再次返回 afterSuccessDeliveryMessageChannel。
【问题讨论】:
-
这没有任何意义,除非故障通道上的下游流以某种方式将其路由回去;启用 DEBUG 日志记录,这样您就可以看到消息是如何流动的。
-
我启用了 DEGUB 日志记录,它只是在频道“gfailureChannel”上显示 postSend (sent=true),下一行显示在频道“afterSuccessDeliveryMessageChannel”上的 PreSend。
-
我也在研究 ExpressionEvaluatingRequestHandlerAdvice 类,它有 @Override 保护对象 doInvoke(ExecutionCallback callback, Object target, Message> message) 抛出检查 onSuccessExpression 的异常,我认为这可能是问题所在我的案例 onSuccessExpression 不为空,因此它将调用 afterSuccessDeliveryMessageChannel。我有点卡在那里。
-
看我的回答...
标签: java spring spring-integration