ローカル EJB

ローカル EJB により、クライアントは、EJB コンテナと同じアプリケーションサーバのインスタンスで実行されます。これは、クライアントが、PortableRemoteObject.narrow メソッドの代わりに簡単なキャストを使用して、ローカルホームインターフェイスにアクセスできることを意味します。

メモ:  EJB のクラスタリングは、ローカル EJB では無効です。

この機能はセッション bean の機能ですが、エンティティ bean でも有効です。すべてのエンティティ bean をローカルとして定義することを検討してください。

ヒント:  一般的なデザインパターンでは、リモートクライアントが、同一サーバ上に共存するローカルエンティティ bean に対してクライアントとして動作するセッション bean を呼び出します。

ローカルホームインターフェイス

ローカルホームインターフェイスは、create メソッドを定義します。create メソッドは、RemoteException を返しません。

次のコードは、ローカルホームインターフェイスを示しています。

import javax.ejb.*;
// EJBLocalHome を拡張します。 
// ローカルインターフェイス (SimpleLocal) を返します。
public interface SimpleLocalHome extends EJBLocalHome {
  public SimpleLocal create() throws CreateException;
}

コンポーネントインターフェイス

ローカルコンポーネントインターフェイスは、ローカルで呼び出すことができるビジネスメソッドを定義します。

次のコードは、ローカルコンポーネントインターフェイスを示しています。

import javax.ejb.*;
// EJBLocalObject を拡張します。
public interface SimpleLocal extends EJBLocalObject {
   public String getMessage();
}

bean 実装インターフェイス

ローカルでアクセスする bean の bean 実装は、リモートアクセスの実装と同じです。サンプルコードについては、 「ステートレスセッション bean」 を参照してください。

EJB デプロイメントディスクリプタ

ローカル EJB のデプロイメントディスクリプタをコーディングする場合は、local-home 要素と local 要素ではなく、home 要素と remote 要素を使用します。

次の例は、ローカル EJB のデプロイメントディスクリプタの要素を示しています。

...
<session>
  <display-name>SimpleLocal</display-name>
  <ejb-name>SimpleLocal</ejb-name>
  <local-home>SimpleLocalHome</local-home>
  <local>SimpleLocal</local>
  <ejb-class>SimpleLocalBean</ejb-class>
  <session-type>Stateless</session-type>
  <transaction-type>Container</transaction-type>
</session>
...

JRun EJB デプロイメントディスクリプタ

次の例は、ローカル bean の JRun EJB デプロイメントディスクリプタを示しています。

<?xml version="1.0"?>
<!DOCTYPE jrun-ejb-jar PUBLIC '-//Macromedia, Inc.//DTD jrun-ejb-jar 
4.0//EN' 'http://jrun.macromedia.com/dtds/jrun-ejb-jar.dtd'>
<jrun-ejb-jar>
  <enterprise-beans>
     <session>
      <ejb-name>SimpleLocal</ejb-name>
      <jndi-name>SimpleLocal</jndi-name>
    </session>
  </enterprise-beans>
</jrun-ejb-jar>

サンプルクライアント

次のサーブレットクライアントでは、JNDI を通じてローカル EJB を検索するさまざまな方法を示します。

J2EE ベンダーフリーテクニック

web.xml ファイルと jrun-web.xml ファイルで ejb-local-ref 要素を定義すると、最も移植しやすいサーブレットクライアントコードが作成できるので、複数の J2EE ベンダーのコンテナで実行するアプリケーションにお勧めします。

これらの要素を定義すると、次のサーブレットコードで示されているように、サーブレットクライアントは、実際のベンダー固有 JNDI ロケーションの代わりに、J2EE ENC (つまり、java:comp/env) を使用して、InitialContext.lookup メソッドを実行します。

...
try {
  // 1:コンテキストを取得します。
  Context ctx = new InitialContext();
  // 2:ENC (java:comp/env) を使用して検索します。
  Object o = ctx.lookup("java:comp/env/ejb/SimpleLocal");
  // ローカル bean にキャストを使用します。
  SimpleLocalHome home = (SimpleLocalHome)o;
  // 3:特定の EJBObject を作成します。
  SimpleLocal test = home.create();
...

JRun 固有テクニック

ejb-local-ref 要素を使用しないクライアントは、次の例に示すように、JNDI 名を指定し、InitialContext.lookup メソッドで local/ 接頭辞を使用します。

...
try {
  // 1:コンテキストを取得します。
  Context ctx = new InitialContext();
  // 2:jrun-ejb-jar.xml ファイルの jndi-name 要素に SimpleLocal しかなくて
も、
  // local/ 接頭辞を使用して検索します。
  Object o = ctx.lookup("local/SimpleLocal");
  // ローカル bean にキャストを使用します。
  SimpleLocalHome home = (SimpleLocalHome)o;
  // 3:特定の EJBObject を作成します。
  SimpleLocal test = home.create();
...

メモ:  クライアントコードでこのオプションを使用すると、J2EE アプリケーションサーバ間で移植できなくなります。しかし、これは JRun だけで実行予定のアプリケーションには役立ち、JRun でのアプリケーションのプロトタイプ作成がすばやく簡単になります。