Как начать транзакцию в клиенте Camel sql и использовать ее дальше

Я использую 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.

Можно ли сделать каждую попытку опроса транзакционной?

ПС. У меня есть обходной путь с компонентом таймера и отдельным маршрутом для каждого SQL, но мне интересно, можно ли решить мою проблему, используя только 1 маршрут, как указано выше.


person aleksei    schedule 14.12.2017    source источник


Ответы (1)


Покопавшись в документации и исходных кодах Camel, я пришел к выводу, что то, о чем я просил, выполнить невозможно. Итак, позвольте мне опубликовать мое обходное решение.
Идея состоит в том, чтобы использовать один из компонентов с расписанием, например компонент таймер. Следующая транзакция может быть запущена, внутри которой выполняются все операции с БД:

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

В конце концов некоторые процессоры могут быть применены между операциями БД для правильной обработки выбранных строк.

person aleksei    schedule 19.01.2018