因此,我有一个Apache Camel路由,它从一个JPA端点读取Data
元素,将它们转换为DataConverted
元素,并通过另一个JPA端点将它们存储到另一个数据库中。
现在,我想在原始的Data
元素上设置一个标志,表示它已成功复制。实现这一点的最佳方法是什么?
我试过了将该ID保存在context
中,然后阅读该ID并访问.onCompletion().onCompleteOnly()
中的dao方法。
from("jpa://Data")
.onCompletion().onCompleteOnly().process(ex -> {
var id = Long.valueOf(getContext().getGlobalOption("id"));
myDao().setFlag(id);
}).end()
.process(ex -> {
Data data = ex.getIn().getBody(Data.class);
DataConverted dataConverted = convertData(data);
ex.getMessage().setBody(data);
var globalOptions = getContext().getGlobalOptions();
globalOptions.put("id", data.getId().toString());
getContext().setGlobalOptions(globalOptions);
})
.to("jpa://DataConverted").end();
然而,这似乎触发了一个死锁,dao方法在提交更新时停顿。唯一的解释可能是Data
对象被Camel锁定,并且仍然被锁定在路由的.onCompletion().onCompleteOnly()
部分,因此它不能在那里被更新。
有没有更好的办法?
1条答案
按热度按时间yvfmudvl1#
您是否尝试过使用收件人列表EIP,其中第一个目标是
jpa:DataConverted
端点,第二个目标将是设置标志的端点。这样,两个目标都将获得相同的消息,并将按顺序执行。https://camel.apache.org/components/3.17.x/eips/recipientList-eip.html
请记住,您可能希望通过添加.transacted()使路由具有事务性
https://camel.apache.org/components/3.17.x/eips/transactional-client.html