2017-12-14 12 views
0

다른 도메인과 Spring Boot 애플리케이션을 통합하기 위해 Camel을 사용하고 있습니다.Camel 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...)"; 

내가 내 하나의 폴링 1 트랜잭션을 실행하려면 다음 SQL을하고 싶습니다 :

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

및 SQL을 다음과 같다 : 나는 간단한 경로 DB를 폴링 SQL 구성 요소를 사용하여 업데이트 구성되어 의뢰. 내가 .transacted("propagationPolicy")으로 거래를 처리 할 수 ​​있다는 것을 알고 있지만 from 앞에 넣을 수는 없습니다.

모든 폴링을 트랜잭션으로 설정할 수 있습니까?

PS. 나는 타이머 구성 요소와 각 SQL에 대한 별도의 경로로 해결 방법을 가지고 있지만 위와 같이 단 1 개의 경로를 사용하여 내 문제를 해결할 수 있는지 궁금합니다.

답변

0

카멜 문서 및 소스 코드를 파헤 쳐서 내가 부탁 한 것이 성취 불가능하다는 결론에 도달했습니다. 따라서 해결 방법 솔루션을 게시 해 보겠습니다.
아이디어는 타이머 구성 요소와 같은 일정 구성 요소 중 하나를 사용하는 것입니다. 다음 트랜잭션은 모든 DB 작업이 완료되는 내부 시작 수 :

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

결국 일부 프로세서가 올바르게 선택된 행을 처리하기 위해 DB 작업 사이에 적용될 수있다.