应用ExpressionEvaluatingRequestHandlerAdvice是否会导致错误?

时间:2015-10-22 10:15:45

标签: spring jms spring-integration aop

适配器转到jms队列。我有一些逻辑需要在成功传递和故障转移时触发,所以我已经将适配器连接到ExpressionEvaluatingRequestHandlerAdvice。

<jms:outbound-channel-adapter id="101Out" 
                              channel="101DestinationChannel"
                              connection-factory="101Factory"
                              destination-expression="headers.DESTINATION_NAME"
                              destination-resolver="namingDestinationResolver"
                              explicit-qos-enabled="true">
    <jms:request-handler-advice-chain>
        <beans:bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
            <beans:property name="onSuccessExpression" ref="success"/>
            <beans:property name="successChannel" ref="normalOpsReplicationChannel"/>
            <beans:property name="onFailureExpression" ref="failure"/>
            <beans:property name="failureChannel" ref="failoverInitiationChannel" />
        </beans:bean>
        <beans:bean id="retryAdvice" class="org.springframework.integration.handler.advice.RequestHandlerRetryAdvice">>
            <beans:property name="retryTemplate" ref="retryTemplate"/>
        </beans:bean>
    </jms:request-handler-advice-chain>       
</jms:outbound-channel-adapter>

现在这两种方法都在适当地触发,并且复制/故障转移逻辑正在执行。但是当失败(当我停止队列管理器)一旦进程连接到failureChannel完成时,我看到错误正在传播回调用源(在这种情况下是HTTP端点)。

建议应该阻止错误传播吗?

    <service-activator input-channel="failoverInitiationChannel"
        ref="failoverInitiator" />

我有一个服务激活器连接到failureChannel,它只是改变一个单例。我在这里做的任何事都无法触发错误。此外,返回的错误肯定是队列访问,因此它不能是我在failoverInitiator激活后所做的任何事情。

org.springframework.jms.IllegalStateException: JMSWMQ0018: Failed to connect to queue manager 'APFDEV1' with connection mode 'Client' and host name 'localhost(1510)'.

如果我应该在RequestHandlerRetryAdvice上使用recoveryCallback或者这个实际上停止错误,我会非常困惑。但我确实需要在成功时采取行动,因此ExpressionEvaluatingAdvice更适合我的场景。

提前感谢您的帮助: - )

1 个答案:

答案 0 :(得分:2)

这是默认行为。有关ExpressionEvaluatingRequestHandlerAdvice属性的详细信息,请参阅trapException javadoc ...

/**
 * If true, any exception will be caught and null returned.
 * Default false.
 * @param trapException true to trap Exceptions.
 */
public void setTrapException(boolean trapException) {
    this.trapException = trapException;
}

我将在参考手册中添加注释。