【问题标题】:Jms message failure with Retry advice send response to fail channel and again pass to successful channel带有重试建议的 Jms 消息失败将响应发送到失败通道并再次传递到成功通道
【发布时间】: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


【解决方案1】:

你的问题是这样的:

您的重试建议从recoveryCallback 发送到failureChannel 并成功退出。

然后当我们查看ExpressionEvaluatingRequestHandlerAdvice 代码时,我们会看到这样的逻辑:

 try {
        Object result = callback.execute();
        if (this.onSuccessExpression != null) {
            evaluateSuccessExpression(message);
        }
        return result;
    }

所以,既然没有异常调用callback,就转到配置的successChannel

要使其失败并转到配置的failureChannel,您应该考虑不使用该recoveryCallback。然后RequestHandlerRetryAdvice 将抛出一个异常,该异常将被ExpressionEvaluatingRequestHandlerAdvice 捕获并发送到failureChannel。不会有 onSuccessExpression 评估,因为我们最终会遇到异常。

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多