[英]Apache Camel timer route too long causing StackOverflow exception
[英]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);
哪里:
我的问题是,如果我包含“ markRollbackOnly()”,它会:
如果我不包括在内,那么:
如何配置骆驼既可以防止事务中消息的刷新,又可以将异常转换为已处理的错误消息?
如果发送到这两个目的地的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.