8.11. クラスター環境の Jakarta Enterprise Beans トランザクション

クライアントコードがクラスター化された Jakarta Enterprise Beans を呼び出すと、クラスターのアフィニティーは自動的に設定されます。クライアント側のトランザクションを管理する場合は、クラスター内の特定のノードをターゲット にするか、クライアントがクラスターノードをレイジーに選択できる ようにしてトランザクションを処理します。本セクションでは、両方のオプションを説明します。

Jakarta Enterprise Beans トランザクションターゲットを特定のノードにする

以下の手順を使用して、クラスター内の特定のノードを対象にし、トランザクションを処理できます。

  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");

    UserTransaction の Java Naming and Directory Interface ルックアップは、以下のコード例のように PROVIDER_URL プロパティーをサーバーの URL に設定し、txn:UserTransaction を検索して実行できます。

    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 Naming and Directory Interface からリモート 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 Beans を呼び出すために使用される InitialContext では PROVIDER_URL プロパティーを指定しないでください。
  2. クライアントで、InitialContext から txn:RemoteUserTransaction を検索します。

    UserTransaction ut = (UserTransaction)ctx.lookup("txn:RemoteUserTransaction");
  3. トランザクションが開始されると、あるクラスターノードが自動的に選択され、サーバーのアフィニティーが確立されて、すべての Jakarta Enterprise Beans 呼び出しがトランザクション期間中その特定のノードにバインドされます。
  4. トランザクションが終了すると、サーバーのアフィニティーがリリースされ、Jakarta Enterprise Beans プロキシーが一般的なクラスターアフィニティーに戻ります。