ローカル 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」 を参照してください。
ローカル 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> ...
次の例は、ローカル 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 を検索するさまざまな方法を示します。
web.xml ファイルと jrun-web.xml ファイルで ejb-local-ref
要素を定義すると、最も移植しやすいサーブレットクライアントコードが作成できるので、複数の J2EE ベンダーのコンテナで実行するアプリケーションにお勧めします。
ejb-local-ref
要素は、次のサンプルに示すように、EJB リファレンス名などの EJB 情報を定義します。
... <ejb-local-ref> <ejb-ref-name>ejb/SimpleLocal</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <local-home>SimpleLocalHome</local-home> <local>SimpleLocal</local> <ejb-link>SimpleLocal</ejb-link> </ejb-local-ref> ...
ejb-local-ref
要素は、次の例に示すように、web.xml ファイルの ejb-ref-name
要素を JNDI 名にマッピングします。... <ejb-local-ref> <ejb-ref-name>ejb/SimpleLocal</ejb-ref-name> <jndi-name>SimpleLocal</jndi-name></ejb-local-ref> ...
これらの要素を定義すると、次のサーブレットコードで示されているように、サーブレットクライアントは、実際のベンダー固有 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(); ...
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 でのアプリケーションのプロトタイプ作成がすばやく簡単になります。