Spring Integration错误记录

时间:2015-02-03 17:19:43

标签: logging spring-integration

我有一些测试Spring Integration的乐趣,所以我创建了这个流程(不是很困难,它就像一个魅力):

  • 用户购买图书
  • 执行了一些转换
  • 以异步方式发送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"/>

更新

您好,感谢您的时间!

我认为我做错了,因为我正在测试请求处理程序 - 建议链/错误通道,这就是我所得到的:

  • 发送jms消息
  • 发生JMS错误(我的JMS服务器因为我测试错误处理而被关闭)并且打印出格式化的错误日志
  • 流程已中止且未购买任何图书

这就是我正在寻找的行为:

  • 发送jms消息
  • 发生JMS错误并打印格式化的错误日志
  • 这本书已经购买,流程结束了!!

有关如何在不中止流量的情况下打印日志的任何线索?如果我使用属性ignore-send-failures="true",流程将忽略JMS错误,但不会打印错误日志。

度过美好的一天!

1 个答案:

答案 0 :(得分:0)

首先,我认为你是对的。

最好将消息发布到JMS,然后才返回到答复。因此,对于真实应用来说,改变<si:recipient-list-router>的频道顺序会更好。

从另一方记录并禁止<si-jms:outbound-channel-adapter>中的异常,您应该将<request-handler-advice-chain>添加到该适配器,并向ExpressionEvaluatingRequestHandlerAdvice提供failureChannel <logging-channel-adapter> ExpressionEvaluatingRequestHandlerAdvice }。

<强>更新

trapException有一个true选项。将其设置为{{1}},您对JMS的例外情况不会被重新抛出。