繁体   English   中英

骆驼异常/错误处理事务路由,不会引起客户端异常

[英]Camel exception/error handling transacted route without causing client exception

我正在使用使用JMS和Apache Camel进行路由的命令事件驱动的系统。 在以下情况下:

  • 我向系统发送请求-回复命令“ X”。

  • 系统通过交易的骆驼路线接收“ X”。

  • 在处理“ X”时,系统会发出多个事件“ Y”和“ Z”,但作为事务处理路径的一部分,在交易完成之前,不应清除这些事件。

  • 发生运行时异常-这将导致事务回滚。

我希望能够拦截异常并以真实的消息(而不是异常)回复客户端。 因此,我开始实现一个错误处理程序:

    onException(RuntimeException.class)
        .handled(true)
        .markRollbackOnly()
        .filter(header(Header.REPLY_TO.getName()).isNotNull())
        .to(DESTINATION_FOR_EXCEPTION_HANDLING)
        .to(DESTINATION_FOR_REPLIES);

哪里:

  • DESTINATION_FOR_EXCEPTION_HANDLING是接受异常并返回消息对象的Bean。
  • DESTINATION_FOR_REPLIES是一个将out主体设置为消息对象的bean

我的问题是,如果我包含“ markRollbackOnly()”,它会:

  • 防止冲洗“ Y”和“ Z”-良好
  • 在发出requestReply的客户端上导致交换异常-BAD

如果我不包括在内,那么:

  • “ Y”和“ Z”被刷新-错误
  • 我在客户端上收到了真实的消息对象-GOOD

如何配置骆驼既可以防止事务中消息的刷新,又可以将异常转换为已处理的错误消息?

如果发送到这两个目的地的onException使用的是与from相同的Camel组件,则您需要为此使用单独的组件,因此它们是独立的。 因为回滚会导致它们全部回滚。

假设您使用ActiveMQ,则只需声明两个组件

   <bean id="activemq" ...>

   <bean id="activemq2" ...>

然后在onException中使用activemq2。 然后可以配置为使用相同的brokerUrl和所有其他内容。 对于第二个,您可能需要将其设置为transacted = false。

我尝试过Claus方法,但由于某种原因无法使它正常工作,我必须误会或设置不正确。

最终,我通过在内部传播第二个事务解决了这个问题,我可以通过错误处理程序对第二个事务“ markRollbackOnlyLast”进行处理,但在主要事务上响应“好”消息:

    TransactionTemplate newTransactionTemplate = new TransactionTemplate(platformTransactionManager);
    newTransactionTemplate.setPropagationBehavior(PROPAGATION_REQUIRES_NEW);
    Policy requireNewTransaction = new SpringTransactionPolicy(newTransactionTemplate);

    onException(RuntimeException.class)
        .onWhen(header(Header.REPLY_TO.getName()).isNotNull())
            .log(LoggingLevel.ERROR, EXCEPTION_STACKTRACE)
            .to(PROCESSOR_FOR_EXCEPTION_HANDLING)
            .to(PROCESSOR_FOR_REPLY)
            .handled(true)
            .markRollbackOnlyLast();

    from(FROM)
        .policy(requireNewTransaction)...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM