14.4. JMS 트랜잭션 구성

14.4.1. 개요

CXF 3.0은 단방향 메시징을 사용할 때 CXF 끝점에서 로컬 JMS 트랜잭션과 JTA 트랜잭션을 모두 지원합니다.

14.4.2. 로컬 트랜잭션

로컬 리소스를 사용하는 트랜잭션은 예외가 발생하는 경우에만 JMS 메시지를 롤백합니다. 데이터베이스 트랜잭션과 같은 다른 리소스를 직접 조정하지 않습니다.

로컬 트랜잭션을 설정하려면 일반적으로 끝점을 구성하고 속성 sessionTrasnsactedtrue 로 설정합니다.

참고

트랜잭션 및 풀링에 대한 자세한 내용은 Red Hat JBoss Fuse 트랜잭션 가이드를 참조하십시오.

14.4.3. JTA 트랜잭션

JTA 트랜잭션을 사용하면 모든 XA 리소스를 조정할 수 있습니다. CXF 끝점이 JTA 트랜잭션용으로 구성된 경우 서비스 구현을 호출하기 전에 트랜잭션을 시작합니다. 예외가 발생하지 않으면 트랜잭션이 커밋됩니다. 그렇지 않으면 롤백됩니다.

JTA 트랜잭션에서는 JMS 메시지가 사용되고 데이터베이스에 기록된 데이터를 사용합니다. 예외가 발생하면 두 리소스가 모두 롤백되므로 메시지가 소비되고 데이터가 데이터베이스에 기록되거나 메시지가 롤백되고 데이터가 데이터베이스에 기록되지 않습니다.

JTA 트랜잭션을 구성하려면 다음 두 단계가 필요합니다.

  1. 트랜잭션 관리자 정의

    • 빈 메서드

      • 트랜잭션 관리자 정의

        <bean id="transactionManager"
           class="org.apache.geronimo.transaction.manager.GeronimoTransactionManager"/>
      • JMS URI에서 트랜잭션 관리자의 이름을 설정합니다.

        jms:queue:myqueue?jndiTransactionManager=TransactionManager

        이 예에서는 ID TransactionManager 가 있는 빈을 찾습니다.

    • OSGi 참조 방법

      • Blueprint를 사용하여 OSGi 서비스로 트랜잭션 관리자를 조회합니다.

        <reference id="TransactionManager" interface="javax.transaction.TransactionManager"/>
      • JMS URI에서 트랜잭션 관리자의 이름을 설정합니다.

        jms:jndi:myqueue?jndiTransactionManager=java:comp/env/TransactionManager

        이 예에서는 JNDI에서 트랜잭션 관리자를 조회합니다.

  2. JCA 풀링 연결 팩토리 구성

    Spring을 사용하여 JCA 풀링 연결 팩토리를 정의합니다.

    <bean id="xacf" class="org.apache.activemq.ActiveMQXAConnectionFactory">
      <property name="brokerURL" value="tcp://localhost:61616" />
    </bean>
    
    <bean id="ConnectionFactory" class="org.apache.activemq.jms.pool.JcaPooledConnectionFactory">
      <property name="transactionManager" ref="transactionManager" />
      <property name="connectionFactory" ref="xacf" />
    </bean>

    이 예에서 첫 번째 빈은 JcaPooledConnectionFactory 에 제공되는 ActiveMQ XA 연결 팩토리를 정의합니다. 그런 다음 JcaPooledConnectionFactory 가 id ConnectionFactory 와 기본 빈으로 제공됩니다.

    JcaPooledConnectionFactory 는 일반 ConnectionFactory처럼 보입니다. 그러나 새 연결 및 세션이 열리면 XA 트랜잭션을 확인하고 있는 경우 JMS 세션을 XA 리소스로 자동으로 등록합니다. 이를 통해 JMS 세션이 JMS 트랜잭션에 참여할 수 있습니다.

    중요

    JMS 전송에서 XA ConnectionFactory를 직접 설정하는 것은 작동하지 않습니다!