【发布时间】:2022-08-22 21:50:35
【问题描述】:
所以我有一个 Apache Camel 路由,它从 JPA 端点读取 Data 元素,将它们转换为 DataConverted 元素,并通过第二个 JPA 端点将它们存储到不同的数据库中。两个端点都是 Oracle 数据库。
现在我想在它被成功复制的原始Data 元素上设置一个标志。实现这一目标的最佳方法是什么?
我是这样尝试的:将ID保存在context中,然后读取它并访问.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() 部分,因此它无法在那里更新。
有更好的方法吗?
标签: oracle jpa apache-camel