如何回滚整个Splitter的交易,以防任何子消息失败。

问题描述 投票:0回答:1

当前使用案例通过下面的配置,我们试图使用自定义迭代器处理器分割父消息,并根据其内容将不同的端点分配给测试处理器内的不同子消息。

from("endpoint")    
    .split().method(iteratorProcessor, "execute")
    .shareUnitOfWork()
    .stopOnException()
    .bean(testProcessor, "process") 
    .receipientList(header("destination"));

通过以上的配置,成功的案例和预期的一样。

问题在拆分后,第一条消息发布成功,第二条消息发布失败的情况下,我们观察到第二条子消息单独被定向到错误处理程序。

要求:如果在整个过程中发生任何故障,我们希望将IN消息重定向到错误处理程序(完全回滚),而不要发布任何其他子消息。

apache-camel rollback
1个回答
0
投票

onException子句提供了一个使用原始消息的选项。

来自Camel文档。

onException(MyOrderException.class)
.useOriginalMessage()
.handled(true)
.to("jms:queue:order:failed");

0
投票

欢迎来到Stack overflow!

在发生错误时,由于语句 stopOnException()జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ 分流器 终止处理。

这意味着对于您的 彻底倒退

  • 您的问题是所有尚未处理的记录。
  • 你的问题是已经成功处理的记录

对于这些,你必须 运筹帷幄 作为回滚的一部分。例如,如果已经处理过的记录被写入数据库,当Splitter发生故障时,你可以在以后删除它们。

根据评论添加

根据 分流器文档,因为你用 shareUnitOfWork() 你应该收到 只有一个错误信息,当Splitter完成后 并且至少有一个错误发生(而不是每个失败的子消息有一个错误消息)。因此,如果你也使用 useOriginalMessage() 的错误处理程序中,您应该会收到原始的 IN 消息。

如果这不起作用,它 可以 撞上 stopOnException() 没试过)。这将是一个尝试,以删除 stopOnException() 并检查它是否能像这样工作。

你不能 径直 补偿一个已经交付的JMS消息,但你可以建立一个 补偿,您可以在事后触发. 例如,将失败的消息从错误处理程序发送到另一个队列,该队列的消费者将回滚第一个消息所做的任何事情。

© www.soinside.com 2019 - 2024. All rights reserved.