ステートフルセッションBeanでの実装

2007年10月16日(火)
田澤 孝之

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
レッドハット株式会社

JBossグループ SE部 マネージャー
1989年より日立製作所にてIT業界に身をおく。1998年より日本BEAシステムズにてTPモニタ、サーバサイドJavaにフォーカス。特にJ2EE に特化しプリセールス、インストラクタ、SOAコンサルタント業務に従事。2006年よりファストサーチ&トランスファで企業向けサーチソリュー ションコンサルタントを経て、2007年よりレッドハットにてJBossの販売提案と導入技術支援を行う。「EJB 2.0 徹底攻略」(技術評論社)など著書、共著多数。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています