9.2. 트랜잭션 끝점의 분리
경로 시작 시 소비자 끝점이 리소스에 액세스하면 교환을 폴링한 후 트랜잭션을 시작하기 때문에 transacted()
명령은 사용되지 않습니다. 즉, 트랜잭션은 너무 늦기 때문에 트랜잭션 범위 내에 소비자 끝점을 포함합니다. 이 경우 올바른 접근 방식은 끝점 자체를 트랜잭션 시작을 담당하도록 하는 것입니다. 트랜잭션을 관리할 수 있는 끝점을 트랜잭션 끝점이라고 합니다.

다음과 같이 트랜잭션 끝점의 두 가지 혼동 모델이 있습니다.
일반적인 경우(일반적으로 트랜잭션 끝점에서 트랜잭션은 다음과 같이 트랜잭션을 위임합니다.General case - normally, a transactional endpoint demarcates transactions as follows:
- 교환이 엔드포인트에 도착하거나 끝점이 교환을 성공적으로 폴링하면 끝점은 연결된 트랜잭션 관리자를 호출하여 트랜잭션을 시작합니다.
- 끝점은 새 트랜잭션을 현재 스레드에 연결합니다.
- 교환이 경로 끝에 도달하면 트랜잭션 끝점은 트랜잭션 관리자를 호출하여 현재 트랜잭션을 커밋합니다.
- InOut 교환이 있는 JMS 끝점 - JMS 소비자 끝점이 InOut 교환을 수신하고 이 교환은 다른 JMS 엔드포인트로 라우팅되는 경우 특수 케이스로 처리되어야 합니다. 문제는 경로가 전체 요청/반복을 단일 트랜잭션으로 묶는 경우 교착 상태가 될 수 있다는 것입니다.
9.2.1. JMS 엔드 포인트가 있는 샘플 경로
9.2절. “트랜잭션 끝점의 분리” 경로 시작 시 트랜잭션 엔드포인트가 있는 경로의 예( from()
명령)를 보여줍니다. 모든 경로 노드는 트랜잭션 범위에 포함됩니다. 이 예에서 경로의 모든 엔드포인트는 JMS 리소스에 액세스합니다.
9.2.2. Java DSL의 경로 정의
다음 Java DSL 예제에서는 트랜잭션 끝점으로 경로를 시작하여 트랜잭션 경로를 정의하는 방법을 보여줍니다.
from("jmstx:queue:giro") .to("jmstx:queue:credits") .to("jmstx:queue:debits");
이전 예에서 트랜잭션 범위는 엔드포인트, jmstx:queue:giro
,jmstx:queue:credits
, jmstx:queue:debits
를 포함합니다. 트랜잭션이 성공하면 기프트 큐에서 교환이 영구적으로 제거되고 신용
큐 및 직불
. 트랜잭션이 실패하면 교환이 큐
로 푸시됩니다신용 및 직불 큐에 배치되지 않고 교환이 기가
큐로 다시 푸시 됩니다
. 기본적으로 JMS는 메시지를 자동으로 다시 전달하려고 시도합니다.
jmstx
인 JMS 구성 요소 빈은 다음과 같이 트랜잭션을 사용하도록 명시적으로 구성해야 합니다.
<blueprint ...> <bean id="jmstx" class="org.apache.camel.component.jms.JmsComponent"> <property name="configuration" ref="jmsConfig" /> </bean> <bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration"> <property name="connectionFactory" ref="jmsConnectionFactory" /> <property name="transactionManager" ref="jmsTransactionManager" /> <property name="transacted" value="true" /> </bean> ... </blueprint>
이전 예에서 트랜잭션 관리자 인스턴스 jmsTransactionManager
는 JMS 구성 요소와 연결되고 트랜잭션 된
속성이 true
로 설정되어 InOnly 교환에 대한 트랜잭션 요약을 활성화합니다.
9.2.3. 블루프린트 XML의 경로 정의
앞의 경로는 다음과 같이 블루프린트 XML로 나타낼 수 있습니다.
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <camelContext xmlns="http://camel.apache.org/schema/blueprint"> <route> <from uri="jmstx:queue:giro" /> <to uri="jmstx:queue:credits" /> <to uri="jmstx:queue:debits" /> </route> </camelContext> </blueprint>
9.2.4. DSL transacted()
명령이 필요하지 않음
Transacted()
DSL 명령은 트랜잭션 끝점으로 시작하는 경로에 필요하지 않습니다. 그러나 기본 트랜잭션 정책은 PROPAGATION_REQUIRED
( 9.4절. “트랜잭션 전파 정책”참조)라고 가정하면 일반적으로 다음 예제와 같이 Transact ed()
명령을 포함하는 것은 무해합니다.
from("jmstx:queue:giro") .transacted() .to("jmstx:queue:credits") .to("jmstx:queue:debits");
그러나 이 경로는 예기치 않은 방식으로 작동할 수 있습니다(예: 블루프린트 XML에서 기본이 아닌 전파 정책이 있는 single Cryostated Policy
VLAN). 9.1.4절. “기본 트랜잭션 관리자 및 트랜잭션 정책”을 참조하십시오. 따라서 일반적으로 트랜잭션 끝점으로 시작하는 경로에 transacted()
DSL 명령을 포함하지 않는 것이 좋습니다.
9.2.5. 경로 시작 시 트랜잭션 끝점
다음 Apache Camel 구성 요소는 경로 시작 시 표시되는 경우 트랜잭션 끝점 역할을 합니다(예: from()
DSL 명령에 표시되는 경우). 즉, 이러한 끝점은 트랜잭션 클라이언트로 작동하도록 구성할 수 있으며 트랜잭션 리소스에도 액세스할 수 있습니다.
- ActiveMQ
- AMQP
- JavaSpace
- JMS
- JPA