| Oracle® Fusion Middleware Oracle WebLogic Server Enterprise JavaBeansのプログラミング 12c リリース1(12.1.1) B65950-02 |
|
![]() 前 |
![]() 次 |
次の項では、バージョン3.xのプログラミング・モデルを使用するEJBのJavaサンプルについて説明します。
次の項では、新しいメタデータ・アノテーション・プログラミング・モデルを使用するEJBの単純なJavaサンプルについて説明します。このガイド内のEJBをプログラミングする方法について説明しているいくつかの項では、これらのサンプルを参照する場合があります。
EJB 3.1のインタフェースなしのローカル・クライアント・ビュー・タイプでは、個別のローカル・ビジネス・インタフェースを必要とすることなく、ローカル・セッションBeanへのアクセスを提供して、コンポーネントでEJB Beanクラス・インスタンスを直接注入させることで、EJBの開発を単純化しています。
次に、ServiceBeanステートレス・セッションEJBのインタフェースなしの単純なビューのコードを示します。
package examples;
@Stateless
public class ServiceBean {
public void sayHelloFromServiceBean() {
System.out.println("Hello From Service Bean!");
}
}
このサンプル・コードで注目すべき主な点は以下のとおりです。
このビュー以外にクライアント・ビューが公開されておらず、Beanクラスのimplements句が記述されていないので、EJBはこのインタフェースなしのビューを自動的に公開します。
ServiceBean Beanファイルは、プレーンJavaファイルであるため、EJB固有のインタフェースを実装する必要はありません。
クラス・レベルの@Statelessメタデータ・アノテーションは、EJBのタイプがステートレス・セッションであることを指定しています。
次に、ServiceBeanステートレス・セッションEJBの単純なビジネス・インタフェースのコードを示します。
package examples;
/**
* Business interface of the Service stateless session EJB
*/
public interface Service {
public void sayHelloFromServiceBean();
}
このコードは、Serviceビジネス・インタフェースに、1つのメソッドsayHelloFromServiceBean()が含まれていることを示します。このメソッドは、パラメータを取らず、voidを返します。
次に、上のServiceインタフェースを実装するBeanファイルのコードを示します。太字部分については、後ほど解説します。
package examples; import javax.ejb.Stateless; import javax.interceptor.ExcludeDefaultInterceptors; /** * Bean file that implements the Service business interface. * Class uses following EJB 3.x annotations: * - @Stateless - specifies that the EJB is of type stateless session * - @ExcludeDefaultInterceptors - specifies any configured default * interceptors should not be invoked for this class */ @Stateless @ExcludeDefaultInterceptors public class ServiceBean implements Service { public void sayHelloFromServiceBean() { System.out.println("Hello From Service Bean!"); } }
このサンプル・コードで注目すべき主な点は以下のとおりです。
標準のimport文を使用して、Beanファイルで使用するメタデータ・アノテーションをインポートしています。
import javax.ejb.Stateless; import javax.interceptor.ExcludeDefaultInterceptors
EJB 3.1にのみ適用されるアノテーションは、javax.ejbパッケージに含まれています。他のJava EEバージョン6コンポーネントで使用できるアノテーションは、より一般的なパッケージ(javax.interceptor、javax.annotationなど)に含まれています。
ServiceBean Beanファイルは、Serviceビジネス・インタフェースを実装するプレーンJavaファイルで、EJB固有のインタフェースを実装する必要はありません。つまり、Beanファイルには、2.xプログラミング・モデルでは必須だったライフサイクル・メソッド(ejbCreate、ejbPassivateなど)を実装する必要はないということです。
クラス・レベルの@Statelessメタデータ・アノテーションは、EJBのタイプがステートレス・セッションであることを指定しています。
クラス・レベルの@ExcludeDefaultInterceptorsアノテーションは、ejb-jar.xmlデプロイメント記述子ファイルでデフォルト・インターセプタが定義されている場合でも、このEJBのメソッド呼出しに対しては、そのデフォルト・インターセプタを呼び出さないことを指定しています。
次に、AccountBeanステートフル・セッションEJBの単純なビジネス・インタフェースのコードを示します。
package examples;
/**
* Business interface for the Account stateful session EJB.
*/
public interface Account {
public void deposit(int amount);
public void withdraw(int amount);
public void sayHelloFromAccountBean();
}
このコードは、Accountビジネス・インタフェースに3つのメソッド(deposit、withdraw、およびsayHelloFromAccountBean)が含まれていることを示します。
次に、上のAccountインタフェースを実装するBeanファイルのコードを示します。太字部分については、後ほど解説します。
package examples; import javax.ejb.Stateful; import javax.ejb.Remote; import javax.ejb.EJB; import javax.annotation.PreDestroy; import javax.interceptor.Interceptors; import javax.interceptor.ExcludeClassInterceptors; /** * Bean file that implements the Account business interface. * Uses the following EJB annotations: * - @Stateful: specifies that this is a stateful session EJB * - @Remote - specifies the Remote interface for this EJB * - @EJB - specifies a dependency on the ServiceBean stateless * session ejb * - @Interceptors - Specifies that the bean file is associated with an * Interceptor class; by default all business methods invoke the * method in the interceptor class annotated with @AroundInvoke. * - @ExcludeClassInterceptors - Specifies that the interceptor methods * defined for the bean class should NOT fire for the annotated * method. * - @PreDestroy - Specifies lifecycle method that is invoked when the * bean is about to be destoryed by EJB container. * */ @Stateful @Remote({examples.Account.class}) @Interceptors({examples.AuditInterceptor.class}) public class AccountBean implements Account { private int balance = 0; @EJB(beanName="ServiceBean") private Service service; public void deposit(int amount) { balance += amount; System.out.println("deposited: "+amount+" balance: "+balance); } public void withdraw(int amount) { balance -= amount; System.out.println("withdrew: "+amount+" balance: "+balance); } @ExcludeClassInterceptors public void sayHelloFromAccountBean() { service.sayHelloFromServiceBean(); } @PreDestroy public void preDestroy() { System.out.println("Invoking method: preDestroy()"); } }
このサンプル・コードで注目すべき主な点は以下のとおりです。
標準のimport文を使用して、Beanファイルで使用するメタデータ・アノテーションをインポートしています。
import javax.ejb.Stateful; import javax.ejb.Remote; import javax.ejb.EJB; import javax.annotation.PreDestroy; import javax.interceptor.Interceptors; import javax.interceptor.ExcludeClassInterceptors;
EJB 3.1にのみ適用されるアノテーションは、javax.ejbパッケージに含まれています。他のJava EE 6コンポーネントで使用できるアノテーションは、より一般的なパッケージ(javax.interceptor、javax.annotationなど)に含まれています。
AccountBean Beanファイルは、Accountビジネス・インタフェースを実装するプレーンJavaファイルで、EJB固有のインタフェースを実装する必要はありません。つまり、Beanファイルには、2.xプログラミング・モデルでは必須だったライフサイクル・メソッド(ejbCreate、ejbPassivateなど)を実装する必要はないということです。
クラス・レベルの@Statefulメタデータ・アノテーションは、EJBのタイプがステートフル・セッションであることを指定しています。
クラス・レベルの@Remoteアノテーションは、EJBのリモート・インタフェースの名前(ここでは、ビジネス・インタフェースと同じAccount)を指定しています。
クラス・レベルの@Interceptors({examples.AuditInterceptor.class})アノテーションは、Beanファイルに関連付けるインターセプタ・クラスを指定しています。通常、このクラスには、ビジネス・メソッド・インターセプタ・メソッドとライフサイクル・コールバック・インターセプタ・メソッドが含まれます。このクラスの詳細については、「インターセプタ・クラスのサンプル」を参照してください。
フィールド・レベルの@EJBアノテーションは、アノテーション変数serviceに、依存先であるServiceBeanステートレス・セッションBeanのコンテキストを注入することを指定しています。注入されるフィールドのデータ型はServiceです。これは、ServiceBean EJBのビジネス・インタフェースです。sayHelloFromAccountBeanメソッド内の次のコードは、依存先であるServiceBeanのsayHelloFromServiceBeanメソッドを呼び出す方法を示しています。
service.sayHelloFromServiceBean();
メソッド・レベルの@ExcludeClassInterceptorsアノテーションは、sayHelloFromAccountBeanメソッドに対しては、関連付けられているインターセプタ・クラス(AuditInterceptor)で指定されている@AroundInvokeメソッドを呼び出さないことを指定しています。
メソッド・レベルの@PreDestroyアノテーションは、EJBコンテナがAccountBeanのインスタンスを破棄する前にpreDestroyメソッドを呼び出すことを指定しています。ビジネス・メソッドおよびライフサイクル・コールバックのインターセプタ・メソッドは、インターセプタ・クラスを関連付ける方法だけでなく、このようにBeanファイル自体の中で指定することもできます。
次に、インターセプタ・クラスのサンプル・コードを示します。このAuditInterceptorクラスは、上のサンプルで示したAccountBeanステートフル・セッションBeanから@Interceptors({examples.AuditInterceptor.class})アノテーションで参照しているインターセプタ・クラスです。太字部分については、後ほど解説します。
package examples; import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; import javax.ejb.PostActivate; import javax.ejb.PrePassivate; /** * Interceptor class. The interceptor method is annotated with the * @AroundInvoke annotation. */ public class AuditInterceptor { public AuditInterceptor() {} @AroundInvoke public Object audit(InvocationContext ic) throws Exception { System.out.println("Invoking method: "+ic.getMethod()); return ic.proceed(); } @PostActivate public void postActivate(InvocationContext ic) { System.out.println("Invoking method: "+ic.getMethod()); } @PrePassivate public void prePassivate(InvocationContext ic) { System.out.println("Invoking method: "+ic.getMethod()); } }
このサンプル・コードで注目すべき主な点は以下のとおりです。
これまでのサンプルと同様に、ファイル内で使用するメタデータ・アノテーションをインポートしています。
import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; import javax.ejb.PostActivate; import javax.ejb.PrePassivate;
インターセプタ・クラスはプレーンJavaクラスです。
このクラスには、次のような空のコンストラクタが含まれています。
public AuditInterceptor() {}
メソッド・レベルの@AroundInvokeは、ビジネス・メソッド・インターセプタ・メソッドを指定しています。このアノテーションは、1つのインターセプタ・クラス内で一度だけ使用できます。
メソッド・レベルの@PostActivateおよび@PrePassivateアノテーションは、EJBコンテナがBeanを再アクティブ化した後とBeanをパッシブ化する前に呼び出すメソッドをそれぞれ指定しています。
|
注意: これらのライフサイクル・コールバック・インターセプタ・メソッドは、ステートフル・セッションBeanにのみ適用されます。 |
次の項では、Oracle WebLogic Serverに付属するパッケージ化されたJava EE 6のサンプル(EJB 3.1の新機能のデモ)について説明します。
このサンプルは、EJB 3.1シングルトン・セッションBeanの使用方法を示しています。これはアプリケーション開発者に、特定のJava仮想マシン(JVM)のアプリケーションで、セッションBeanが一度インスタンス化されることが保証される正式なプログラミング構造を提供します。このサンプルで、@SingletonセッションBeanは、中央カウンタ・サービスを提供します。カウンタEJBは、Javaクライアントから呼び出され、それが使用されていることを示します。クライアントが複数回呼び出されると、カウントはそのたびに1ずつ増分されます。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
WL_HOME/samples/server/examples/src/examples/javaee6/ejb/singletonBean
WL_HOMEは、WebLogic Serverのインストール・ディレクトリ(たとえば/Oracle/Middleware/wlserver_12.1)です。
このサンプルは、EJB 3.1の非同期メソッドの呼出しの使用方法について示します。@AsynchronousアノテーションをEJBクラスまたは特定のメソッドに追加すると、メソッドが呼び出されたときに、クライアントに即座に制御を戻すようにEJBコンテナに指示します。メソッドはFutureオブジェクトを返し、これによりクライアントはメソッド呼出しのステータスをチェックして、非同期に生成される結果の値を取得できます。
このサンプルでは、@Stateless Beanはクラス・レベルでアノテーションが付けられます。@Asynchronousはそのメソッドがすべて非同期であることを示し、それぞれのメソッドで長時間の計算をシミュレートします。サーブレットを使用して様々な非同期メソッドをコールし、呼び出しと完了回数を追跡して、メソッド・コールの非同期の動作を示します。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
WL_HOME/samples/server/examples/src/examples/javaee6/ejb/asyncMethodOfEJB
WL_HOMEは、WebLogic Serverのインストール・ディレクトリ(たとえば/Oracle/Middleware/wlserver_12.1)です。
このサンプルは、EJB 3.1の豊富なスケジューリング機能を示しています。このスケジューリング機能は、EJBメソッドに配置できるCRONスタイルのスケジュール定義という形式をとり、定義されたスケジュールに応じてメソッドが自動的に呼び出されます。このサンプルは、メソッドがコールされたときのタイムスタンプを生成して保存する、@SingletonセッションBeanのメソッド用に定義された@Scheduleアノテーションの使用方法を示しています。対応するサーブレットが提供され、その中にTimerBeanが注入されて、ブラウザに表示されるタイムスタンプのリストが取得されます。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
WL_HOME/samples/server/examples/src/examples/javaee6/ejb/calendarStyledTimer
WL_HOMEは、WebLogic Serverのインストール・ディレクトリ(たとえば/Oracle/Middleware/wlserver_12.1)です。
このサンプルは、EJB 3.1で提供された単純化されたプログラミングおよびパッケージ化モデルの変更を示しています。前のバージョンではJavaインタフェースを使用する必要がありましたが、EJB 3.1ではその必要性がなくなったので、古いプレーンJavaオブジェクトにアノテーションを付けてEJBコンポーネントとして使用できます。EJBコンポーネントを直接Webアプリケーションの中に配置する機能によりさらに単純化が進んだので、WebコンポーネントとEJBコンポーネントを保存するアーカイブを生成して、それらをともにエンタープライズ・アーカイブ(EAR)ファイルに組み込む必要がなくなりました。
このサンプルでは、@Statelessアノテーションを古いプレーンJavaクラスに指定し、これをEJBセッションBeanとして公開します。これはさらに、@EJBアノテーションを使用して@WebServletクラスに注入して、それがEJBモジュールとして使用することを示します。EJBセッションBeanとサーブレット・クラスは、ともに単一のWARファイルにパッケージ化されてデプロイメントされます。これにより、Java EE 6で使用できる単純化されたパッケージおよびデプロイメントの変更について説明します。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
WL_HOME/samples/server/examples/src/examples/javaee6/ejb/noInterfaceViewInWAR
WL_HOMEは、WebLogic Serverのインストール・ディレクトリ(たとえば/Oracle/Middleware/wlserver_12.1)です。
このサンプルは、EJB 3.1で使用可能な、ポータブル・グローバルJNDIネーミング・オプションの使用方法を示しています。ポータブル・グローバルJNDIでは、一般的でよく知られているネームスペースを多数提供し、そのネームスペースでjava:global[/<アプリケーション名>]/<モジュール名>/<Bean名>というパターンを使用して、EJBコンポーネントを登録およびルックアップできます。これにより、EJBコンポーネントをJNDIに登録する方法および場所、およびそれらをアプリケーションでルックアップおよび使用する方法を標準化します。このサンプルでは、サーブレットでポータブルJNDI名java:module/HelloBeanを使用してEJBセッションBeanをルックアップします。
WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
WL_HOME/samples/server/examples/src/examples/javaee6/ejb/portableGlobalJNDIName
WL_HOMEは、WebLogic Serverのインストール・ディレクトリ(たとえば/Oracle/Middleware/wlserver_12.1)です。
セッションBeanからエンティティを呼び出すサンプルについては、配布キットに含まれているEJB 3.0のサンプルを参照してください。WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。
WL_HOME/samples/server/examples/src/examples/ejb/ejb30
WL_HOMEは、WebLogic Serverのインストール・ディレクトリ(たとえば/Oracle/Middleware/wlserver_12.1)です。