如何在 Camel sql 消费者中开始交易并进一步使用它
How to start transaction in Camel sql consumer and use it further
我正在使用 Camel 将 Spring 引导应用程序与其他域集成。
我有一个使用 SQL 组件配置的简单路由,用于轮询和更新数据库:
from("sql:"+selectSQL+"?consumer.delay=20000&onConsume="+updateSQL)
.log("---select sql done")
.to("sql:" + insertSQL);
和SQL是这样的:
String selectSQL = "SELECT * FROM T1 WHERE PROCESSED is null and ROWNUM <4 for update skip locked";
String updateSQL = "update T1 set PROCESSED='TRUE' where id = :#id";
String insertSQL = "insert into T2 (col_name...) values (col_value...)";
我希望这些 SQLs 到 运行 在单个轮询请求的 1 个事务中。我知道我可以让路线与 .transacted("propagationPolicy")
交易,但我不能把它放在 from
.
之前
是否可以让每次轮询尝试都具有事务性?
PS。我有一个计时器组件的解决方法,每个 SQL 都有单独的路由,但我想知道是否可以仅使用上述 1 条路由来解决我的问题。
在深入研究了 Camel 文档和源代码后,我得出结论,我所要求的是不可能实现的。所以让我 post 我的解决方法。
想法是使用其中一个具有调度功能的组件,例如 timer 组件。可以启动下一个事务,其中完成了所有数据库操作:
from("timer:pollingTimer?period=20s")
.transacted("propagationRequired")
.to("sql:" + selectSQL)
.to("sql:" + updateSQL)
.to("sql:" + insertSQL)
.log("processing is done");
最终可以在数据库操作之间应用一些处理器来正确处理选定的行。
我正在使用 Camel 将 Spring 引导应用程序与其他域集成。 我有一个使用 SQL 组件配置的简单路由,用于轮询和更新数据库:
from("sql:"+selectSQL+"?consumer.delay=20000&onConsume="+updateSQL)
.log("---select sql done")
.to("sql:" + insertSQL);
和SQL是这样的:
String selectSQL = "SELECT * FROM T1 WHERE PROCESSED is null and ROWNUM <4 for update skip locked";
String updateSQL = "update T1 set PROCESSED='TRUE' where id = :#id";
String insertSQL = "insert into T2 (col_name...) values (col_value...)";
我希望这些 SQLs 到 运行 在单个轮询请求的 1 个事务中。我知道我可以让路线与 .transacted("propagationPolicy")
交易,但我不能把它放在 from
.
是否可以让每次轮询尝试都具有事务性?
PS。我有一个计时器组件的解决方法,每个 SQL 都有单独的路由,但我想知道是否可以仅使用上述 1 条路由来解决我的问题。
在深入研究了 Camel 文档和源代码后,我得出结论,我所要求的是不可能实现的。所以让我 post 我的解决方法。
想法是使用其中一个具有调度功能的组件,例如 timer 组件。可以启动下一个事务,其中完成了所有数据库操作:
from("timer:pollingTimer?period=20s")
.transacted("propagationRequired")
.to("sql:" + selectSQL)
.to("sql:" + updateSQL)
.to("sql:" + insertSQL)
.log("processing is done");
最终可以在数据库操作之间应用一些处理器来正确处理选定的行。