如何在Camel sql使用者中启动事务并进一步使用它

时间:2017-12-14 15:40:06

标签: spring spring-boot transactions apache-camel camel-sql

我正在使用Camel将Spring Boot应用程序与其他域集成。 我有一个使用SQL Component配置的简单路由,用于轮询和更新DB:

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...)";

我希望这些SQL在单个轮询请求的1个事务中运行。我知道我可以使用.transacted("propagationPolicy")进行路线交易,但我无法在from之前进行交易。

是否有可能让每次投票都尝试交易?

PS。我有一个针对每个SQL的计时器组件和单独路由的解决方法,但我想知道是否可以仅使用上述1个路由来解决我的问题。

1 个答案:

答案 0 :(得分:0)

在深入研究Camel文档和源代码后,我得出的结论是我所要求的是无法实现的。那么让我发布我的解决方案。
这个想法是使用一个具有计时器组件等安排的组件。可以启动下一个事务,在其中完成所有数据库操作:

from("timer:pollingTimer?period=20s")
    .transacted("propagationRequired")
    .to("sql:" + selectSQL)
    .to("sql:" + updateSQL)
    .to("sql:" + insertSQL)
    .log("processing is done");

最终,可以在数据库操作之间应用一些处理器来正确处理选定的行。