java - Camel 异常/错误处理事务路由,不会导致客户端异常

标签 java error-handling apache-camel transactional

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

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

  • 系统通过交易 Camel 路由接收“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 是将输出正文设置为消息对象的 Bean

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

  • 防止“Y”和“Z”被刷新 - 好
  • 在发出 requestReply 的客户端上导致交换异常 - 不好

如果我不包含它,那么:

  • “Y”和“Z”被冲红 - 不好
  • 我在客户端收到了真实的消息对象 - 好

如何配置camel以防止刷新事务中的消息,同时能够将异常转换为已处理的错误消息?

最佳答案

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

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

   <bean id="activemq" ...>

   <bean id="activemq2" ...>

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

关于java - Camel 异常/错误处理事务路由,不会导致客户端异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28832133/

相关文章:

error-handling - 在 Fortran 运行时禁用 FPE 处理程序

java - Camel 消耗单个消息并停止,进行事务处理

java - 在 Scala/Java 中将未定义传递给 Nashorn Javascript

java - 使用 JTabbedPane 时抛出异常

java - Java 中的 Crystal Report DB 身份验证

java - Camel @BeanInject 在蓝图测试中不起作用

java - jmxagent 在添加到 Camel 上下文中时抛出 saxparse 异常

java - 在已经使用 spring-mvc 作为依赖项的依赖项的应用程序中设置 spring-mvc

matlab - 在 for 循环 matlab 中使用 try ... catch 结构时如何将所有错误保留在文件中

python - 如何修复不起作用的 Python Try/Except 语句