9.2. 트랜잭션 끝점의 분리


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

Camel 경로 tx 엔드 포인트

다음과 같이 트랜잭션 끝점의 두 가지 혼동 모델이 있습니다.

  • 일반적인 경우(일반적으로 트랜잭션 끝점에서 트랜잭션은 다음과 같이 트랜잭션을 위임합니다.General case - normally, a transactional endpoint demarcates transactions as follows:

    1. 교환이 엔드포인트에 도착하거나 끝점이 교환을 성공적으로 폴링하면 끝점은 연결된 트랜잭션 관리자를 호출하여 트랜잭션을 시작합니다.
    2. 끝점은 새 트랜잭션을 현재 스레드에 연결합니다.
    3. 교환이 경로 끝에 도달하면 트랜잭션 끝점은 트랜잭션 관리자를 호출하여 현재 트랜잭션을 커밋합니다.
  • 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
맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat, Inc.