适配器转到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更适合我的场景。
提前感谢您的帮助: - )
答案 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;
}
我将在参考手册中添加注释。