ステートフルセッションBeanでの実装
EJB 3クライアントの実装
デプロイが完了したEJBにリモートクライアントからアクセスしてみます。リモートクライアントでは、JNDIの初期コンテキストを取得し、EJBをルックアップする必要があります。
この方法は従来の方法と変わりありません。ただし、EJB 3からはホームインターフェースが廃止されていますのでホームスタブを取得してライフサイクルメソッドを呼び出すことはせず、直接EJBをJNDIから ルックアップ(取得)してビジネスメソッドを実行します。またEJBコンテナ内、すなわちEJBからEJBを呼びだす場合はJNDIルックアップを利用せ ずに、@EJBアノテーションを利用することが可能です。これは別の機会に紹介します。
なおEJBクライアントのコンパイル時のクラスパスには、JARファイル「jbossall-client.jar」を指定してください。これは利用するEJBのインンタフェースとJBoss EAPインストールディレクトリ以下のjboss-as/clientディレクトリにあります。
以下にEJBのクライアントのコードを示します。
EJBクライアント BankEJBClientSLSB.java
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import ejb3bankapp.Account;
import ejb3bankapp.BankControl;
public class BankEJBClientSLSB {
public static void main(String[] args) {
try {
InitialContext initialContext = getInitialContext(); ←(1)
BankControl bankControl =
(BankControl) initialContext.lookup("BankControlBean/remote"); ←(2)
Account accountA = new Account(1000, 0, "ttazawa"); ←(3)
Account accountB = new Account(2000, 100000, "eyazawa"); ←(3)
accountA = bankControl.deposit(accountA, 15000);
System.out.println(accountA.getName() +":"+ accountA.getBalance());
System.out.println(accountB.getName() +":"+ accountB.getBalance());
accountA = bankControl.withdraw(accountA, 10000); ←(4)
accountB = bankControl.deposit(accountB, 10000); ←(5)
System.out.println(accountA.getName() +":"+ accountA.getBalance());
System.out.println(accountB.getName() +":"+ accountB.getBalance());
} catch (Exception e) { ←(6)
e.printStackTrace();
}
}
private static InitialContext getInitialContext() throws NamingException{
Properties properties = new Properties();
properties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
properties.put(javax.naming.Context.PROVIDER_URL,
"jnp://localhost:1099");
return new javax.naming.InitialContext(properties);
}
}
ここでは、まずJNDIの初期コンテキストをJBoss EAPから取得(1)し、取得した初期コンテキストを利用してJNDI名「BankControlBean/remote」をルックアップ(2)しています。
次に、Accountクラスを2つインスタンス化し(3)その2つのAccountオブジェクトをBankControlBeanのビジネスメソッドの引数に指定します。振り込み処理として、出金(4)と入金処理(5)をそれぞれの口座に対して実行しています。
ちなみに、今回のサンプルクライアントプログラムでは例外のハンドリングは行っていません。実際のプログラムでは状況に応じた例外処理が必要となります。
実行結果は以下のようになります。
ttazawa:15000
eyazawa:100000
ttazawa:5000
eyazawa:110000