我正在使用命令事件驱动系统,使用 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/