2017-12-14 3 views
0

Ich verwende Camel für die Integration von Spring Boot-Anwendung mit anderen Domänen. Ich habe einen einfachen Weg zum Abfragen mit SQL-Komponente konfiguriert und Aktualisierung der DB:So starten Sie die Transaktion in Camel sql Consumer und verwenden Sie es weiter

from("sql:"+selectSQL+"?consumer.delay=20000&onConsume="+updateSQL) 
    .log("---select sql done") 
    .to("sql:" + insertSQL); 

und SQLs wie diese sind:

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

Und ich würde diese SQLs gerne innerhalb 1 Transaktion für einzelne Abfrage ausführen anfordern. Ich weiß, dass ich mit .transacted("propagationPolicy") Route tätigen kann, aber ich kann es nicht vor from setzen.

Ist es möglich, jeden Abrufversuch transaktional zu machen?

PS. Ich habe einen Workaround mit Timer-Komponente und separate Route für jeden SQL aber ich frage mich, ist es möglich, mein Problem zu lösen, indem ich nur 1 Route wie oben benutze.

Antwort

0

Nach dem Graben in der Camel Dokumentation und Quellcodes kam ich zu dem Schluss, dass das, was ich gefragt habe, nicht möglich ist, zu erreichen. Lassen Sie mich daher meine Problemumgehung posten.
Die Idee ist, eine der Komponenten mit Zeitplan wie Timer Komponente zu verwenden. Nächste Transaktion kann gestartet werden, innerhalb dem all DB-Betrieb ist getan:

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

Schließlich einige Prozessoren zwischen DB-Operationen angewandt werden könnten, um korrekt ausgewählte Zeilen zu verarbeiten.

Verwandte Themen