1

我正在使用 Camel 将 Spring Boot 应用程序与其他域集成。我有一个使用 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...)";

我希望这些 SQL 在单个轮询请求的 1 个事务中运行。我知道我可以进行路线交易,.transacted("propagationPolicy")但我不能把它放在前面from

是否有可能使每次轮询尝试都具有事务性?

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

4

1 回答 1

1

在深入研究了 Camel 文档和源代码后,我得出结论,我所要求的是不可能实现的。所以让我发布我的解决方法。
这个想法是使用具有调度功能的组件之一,例如计时器组件。可以启动下一个事务,在其中完成所有 DB 操作:

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

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

于 2018-01-19T12:34:54.780 回答