8.11. 클러스터형 환경에서 자카르타 엔터프라이즈 빈 트랜잭션

클라이언트 코드가 클러스터형 Jakarta Enterprise Bean을 호출하면 클러스터 선호도가 자동으로 설정됩니다. 클라이언트 측에서 트랜잭션을 관리하는 경우 클러스터에서 특정 노드를 대상으로 하도록 선택하거나 클라이언트가 트랜잭션을 처리할 클러스터 노드를 지연적으로 선택할 수 있습니다. 이 섹션에서는 두 옵션에 대해 설명합니다.

Jakarta Enterprise Beans Transactions 특정 노드를 대상으로 합니다

다음 절차에 따라 클러스터의 특정 노드를 대상으로 트랜잭션을 처리할 수 있습니다.

  1. InitialContext 를 생성할 때 PROVIDER_URL 속성을 사용하여 대상 클러스터 노드 주소를 지정합니다.

    props.put(Context.PROVIDER_URL, "remote+http://127.0.0.1:8080");
    ...
    InitialContext ctx = new InitialContext(props);
  2. 클라이언트에서 InitialContext 에서 txn:RemoteUserTransaction 을 조회합니다.

    UserTransaction ut = (UserTransaction)ctx.lookup("txn:RemoteUserTransaction");

    PROVIDER_URL 속성을 서버의 URL로 설정한 다음 아래 코드 예와 같이 txn:User Transaction을 조회하여 User Transaction 에 대한 Java 네이밍 및 디렉터리 인터페이스 조회를 수행할 수 있습니다.

    final Hashtable<String, String> jndiProperties = new Hashtable<>();
    jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
    jndiProperties.put(Context.PROVIDER_URL, "remote+http://localhost:8080");
    final Context context = new InitialContext(jndiProperties);
    
    SecuredEJBRemote reference = (SecuredEJBRemote) context.lookup("txn:UserTransaction");

    UserTransaction 은 실제 호출이 수행될 때까지 특정 대상에 바인딩되지 않습니다. 호출 시 이 UserTransaction 은 트랜잭션의 전체 수명 동안 해당 대상에 바인딩됩니다.

    UserTransaction 을 시작하기 전에 노드 이름이나 대상을 알 필요가 없습니다. org.jboss.ejb.client.EJBClient.getUserTransaction() 메서드는 첫 번째 호출에 따라 대상을 자동으로 선택하는 원격 UserTransaction 을 제공합니다. Java 네이밍 및 디렉터리 인터페이스에서 원격 UserTransaction 을 조회하는 방법도 동일한 방식으로 작동합니다.

    참고

    org.jboss.ejb.client.EJBClient.getUserTransaction() 메서드는 더 이상 사용되지 않습니다.

  3. 트랜잭션이 시작되면 모든 Jakarta Enterprise Beans 호출이 트랜잭션 기간 동안 해당 특정 노드에 바인딩되어 서버 선호도를 설정합니다.
  4. 트랜잭션이 종료되면 서버 선호도가 릴리스되고 Jakarta Enterprise Beans 프록시는 일반 클러스터 선호도로 돌아갑니다.

Jakarta Enterprise Beans Transactions Lazily Select a Node

클라이언트에서 트랜잭션과 관련된 첫 번째 호출 중에 트랜잭션을 처리하도록 클러스터 노드를 지연적으로 선택할 수 있습니다. 이를 통해 클러스터 전체에서 트랜잭션의 부하를 분산할 수 있습니다. 이 옵션을 사용하려면 아래 절차를 따르십시오.

  1. Jakarta Enterprise Bean을 호출하는 데 사용되는 InitialContextPROVIDER_URL 속성을 지정하지 마십시오.
  2. 클라이언트에서 InitialContext 에서 txn:RemoteUserTransaction 을 조회합니다.

    UserTransaction ut = (UserTransaction)ctx.lookup("txn:RemoteUserTransaction");
  3. 트랜잭션이 시작되면 하나의 클러스터 노드가 자동으로 선택되어 서버 선호도를 설정하고 모든 Jakarta Enterprise Beans 호출이 트랜잭션 기간 동안 해당 특정 노드에 바인딩됩니다.
  4. 트랜잭션이 종료되면 서버 선호도가 릴리스되고 Jakarta Enterprise Beans 프록시는 일반 클러스터 선호도로 돌아갑니다.