Spring 集成错误记录
Spring Integration error logging
我正在对 Spring 集成进行一些有趣的测试,所以我创建了这个流程(不是很困难,而且效果很好):
- 用户购买了一本书
- 执行了一些转换
- Jms消息异步发送
但我有一个问题:你知道如果出站通道适配器失败,是否有任何方法可以打印日志?我不在乎 JMS 发布操作失败,因为流程结束返回正确的书籍有效负载,但显示日志会很好,而且我认为我对 Spring IO 错误处理有点混乱。
提前致谢!
<si:channel id="purchaseBookInputChannel" />
<si:channel id="purchaseBookReplyChannel" />
<si:channel id="purchaseBookRoutingChannel" />
<si:channel id="purchaseBookJmsInputChannel" />
<si:chain id="purchaseBookChain" input-channel="purchaseBookInputChannel" output-channel="purchaseBookRoutingChannel">
<si:service-activator ref="bookServiceActivator" method="purchase" />
<si:transformer ref="bookTransformer" method="transform" />
</si:chain>
<si:recipient-list-router id="purchaseBookRouter" input-channel="purchaseBookRoutingChannel" ignore-send-failures="true" >
<si:recipient channel="purchaseBookJmsInputChannel" />
<si:recipient channel="purchaseBookReplyChannel" />
</si:recipient-list-router>
<si-jms:outbound-channel-adapter channel="purchaseBookJmsInputChannel" connection-factory="connectionFactory" destination="bookQueue">
<si-jms:request-handler-advice-chain>
<bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
<property name="onFailureExpression" value="#exception" />
<property name="failureChannel" ref="logginChannel" />
<property name="trapException" value="true" />
</bean>
</si-jms:request-handler-advice-chain>
</si-jms:outbound-channel-adapter>
<si:logging-channel-adapter id="logginChannel" level="WARN"/>
更新
您好,感谢您的宝贵时间!
我想我做错了什么,因为我正在测试 request-handler-advice-chain/error-channel,这就是我得到的结果:
- jms 消息已发送
- 发生 JMS 错误(我的 JMS 服务器已关闭,因为我正在测试错误处理)并打印了格式化的错误日志
- 流程中止,未购买图书
这就是我正在寻找的行为:
- jms 消息已发送
- 发生 JMS 错误并打印格式化的错误日志
- 书已购买,流程结束ok!!
关于如何在不中止流程的情况下打印日志的任何线索?。如果我使用 属性 ignore-send-failures="true"
流程会忽略 JMS 错误,但不会打印错误日志。
祝你有愉快的一天!
首先我认为你是不对的。
最好将消息发布到 JMS,然后才 return 回复。因此,对于实际应用程序来说,更改 <si:recipient-list-router>
.
的通道顺序会更好
从另一端记录和抑制来自 <si-jms:outbound-channel-adapter>
的异常,您应该将 <request-handler-advice-chain>
添加到该适配器并提供 ExpressionEvaluatingRequestHandlerAdvice
和 failureChannel
到 <logging-channel-adapter>
.
更新
ExpressionEvaluatingRequestHandlerAdvice
有一个 trapException
选项。将其设置为 true
并且不会重新抛出来自 JMS 的异常。
我正在对 Spring 集成进行一些有趣的测试,所以我创建了这个流程(不是很困难,而且效果很好):
- 用户购买了一本书
- 执行了一些转换
- Jms消息异步发送
但我有一个问题:你知道如果出站通道适配器失败,是否有任何方法可以打印日志?我不在乎 JMS 发布操作失败,因为流程结束返回正确的书籍有效负载,但显示日志会很好,而且我认为我对 Spring IO 错误处理有点混乱。
提前致谢!
<si:channel id="purchaseBookInputChannel" />
<si:channel id="purchaseBookReplyChannel" />
<si:channel id="purchaseBookRoutingChannel" />
<si:channel id="purchaseBookJmsInputChannel" />
<si:chain id="purchaseBookChain" input-channel="purchaseBookInputChannel" output-channel="purchaseBookRoutingChannel">
<si:service-activator ref="bookServiceActivator" method="purchase" />
<si:transformer ref="bookTransformer" method="transform" />
</si:chain>
<si:recipient-list-router id="purchaseBookRouter" input-channel="purchaseBookRoutingChannel" ignore-send-failures="true" >
<si:recipient channel="purchaseBookJmsInputChannel" />
<si:recipient channel="purchaseBookReplyChannel" />
</si:recipient-list-router>
<si-jms:outbound-channel-adapter channel="purchaseBookJmsInputChannel" connection-factory="connectionFactory" destination="bookQueue">
<si-jms:request-handler-advice-chain>
<bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
<property name="onFailureExpression" value="#exception" />
<property name="failureChannel" ref="logginChannel" />
<property name="trapException" value="true" />
</bean>
</si-jms:request-handler-advice-chain>
</si-jms:outbound-channel-adapter>
<si:logging-channel-adapter id="logginChannel" level="WARN"/>
更新
您好,感谢您的宝贵时间!
我想我做错了什么,因为我正在测试 request-handler-advice-chain/error-channel,这就是我得到的结果:
- jms 消息已发送
- 发生 JMS 错误(我的 JMS 服务器已关闭,因为我正在测试错误处理)并打印了格式化的错误日志
- 流程中止,未购买图书
这就是我正在寻找的行为:
- jms 消息已发送
- 发生 JMS 错误并打印格式化的错误日志
- 书已购买,流程结束ok!!
关于如何在不中止流程的情况下打印日志的任何线索?。如果我使用 属性 ignore-send-failures="true"
流程会忽略 JMS 错误,但不会打印错误日志。
祝你有愉快的一天!
首先我认为你是不对的。
最好将消息发布到 JMS,然后才 return 回复。因此,对于实际应用程序来说,更改 <si:recipient-list-router>
.
从另一端记录和抑制来自 <si-jms:outbound-channel-adapter>
的异常,您应该将 <request-handler-advice-chain>
添加到该适配器并提供 ExpressionEvaluatingRequestHandlerAdvice
和 failureChannel
到 <logging-channel-adapter>
.
更新
ExpressionEvaluatingRequestHandlerAdvice
有一个 trapException
选项。将其设置为 true
并且不会重新抛出来自 JMS 的异常。