【发布时间】:2015-03-03 12:43:38
【问题描述】:
我正在使用 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 是一个 bean,它将输出正文设置为消息对象
我遇到的问题是,如果我包含“markRollbackOnly()”它:
- 防止“Y”和“Z”被刷新 - 好
- 在发出 requestReply 的客户端上导致交换异常 - BAD
如果我不包括它,那么:
- “Y”和“Z”被刷新 - 坏
- 我在客户端收到正版消息对象 - 好
如何配置 camel 以防止在事务中刷新消息,同时能够将异常转换为已处理的错误消息?
【问题讨论】:
标签: java error-handling apache-camel transactional