組み込み可能な EJB コンテナーを使用したアプリケーションの開発
組み込み可能な Enterprise JavaBeans (EJB) コンテナーを使用してアプリケーションを開発する場合は、このタスクを使用します。組み込み可能コンテナーで稼働するアプリケーションは、完全アプリケーション・サーバーで稼働するときよりも開始時間が短縮され、必要な占有スペースも少なくなります。これは、最終的にアプリケーション・サーバーで稼働する可能性があるアプリケーションの迅速な開発とテストに最適な環境です。
始める前に
ご使用の Bean が検索属性を持つ javax.annotation.Resource アノテーションを使用する場合は、Java Endorsed Standards Override Mechanism を使用して、システム上の JDK で使用可能な javax.annotation.Resource API をオーバーライドすることも必要です。app_server_root¥runtimes¥endorsed¥endorsed_apis_9.0.jar ファイルを、選択したターゲット・ディレクトリーにコピーします。Java コマンドで java.endorsed.dirs プロパティーを使用して、コピーされた JAR ファイルを含むディレクトリーを指定します。
手順
- EJB 3.X モジュールを作成します。 このモジュールを作成する際、このモジュールが WebSphere 組み込み可能コンテナーでサポートされるフィーチャーのみを含むようにする必要があります。 サポートされている機能がすべて記載されたリストについては、組み込み可能 EJB コンテナーの機能を参照してください。EJB モジュールは、組み込み可能コンテナーのクラスパス上に配置されている必要があります。EJB モジュールは、クラスのディレクトリーまたは EJB JAR ファイルとしてパッケージ化できます。
- 組み込み可能コンテナーの起動とエンタープライズ Bean 上のメソッドの開始を行うメイン・クラスを作成します。 javax.ejb.EJBContainer クラスを使用して、組み込み可能コンテナーのインスタンスを作成し (オプションでコンテナー構成パラメーターを渡します)、コンテナーのネーミング・コンテキストを取得して、組み込み可能コンテナーを閉じます。
次のサンプル・コードは、組み込み可能コンテナーの使用例を示しています。
//EmbeddableContainerSample.java import java.util.HashMap; import java.util.Map; import javax.ejb.embeddable.EJBContainer; import my.pkg.MyBeanIface; // this is the local business interface of the // enterprise bean public class EmbeddableContainerSample { public static void main(String[] args) throws Throwable { // Create a properties map to pass to the embeddable container: Map<String,Object> properties = new HashMap<String,Object>(); // Specify that you want to use the WebSphere embeddable container: properties.put(EJBContainer.PROVIDER, "com.ibm.websphere.ejbcontainer.EmbeddableContainerProvider"); // Create the container instance, passing it the properties map: EJBContainer ec = EJBContainer.createEJBContainer(properties); // Use the container context to look up a bean: MyBeanIface bean = ec.getContext().lookup("java:global/MyEJBModule/MyBean!my.pkg.MyBeanIface"); // Invoke a method on the bean instance: bean.doStuff(); ... // Close the embeddable container: ec.close(); } }
このサンプル・コードでは、EJBContainer.PROVIDER プロパティーを com.ibm.websphere.ejbcontainer.EmbeddableContainerProvider クラスに指定し、そのプロパティーを EJBContainer.createEJBContainer メソッドに渡すことによって、組み込み可能コンテナーのインスタンスを作成しました。また、コンテナーのネーミング・コンテキストを使用して、MyBean などのローカル・エンタープライズ Bean を検索しました。この検索では、移植可能なグローバル・ネーミング構文が使用されます。
このサンプル・コードでは、組み込み可能コンテナーがクラスパスを自動的にスキャンして EJB モジュール MyEJBModule を見つけるということが想定されています。 これに代わる方法として、EJBContainer.MODULES プロパティーを使用して、開始するモジュールを指定することもできます。 このプロパティーを使用して、JVM クラスパスになければならないモジュール名のストリングまたはストリング配列を指定します。
また、クラスパスにないモジュールのファイルまたはファイル配列を指定することもできます。 このファイルまたはファイル配列のアプローチでは、これらのモジュールが JVM クラスパスにもない追加ライブラリーを必要とする場合、現行スレッドのコンテキスト・クラス・ローダーを変更しなければならないことがあります。
次のコード・サンプルは、ファイル配列を使用して組み込み可能コンテナーを開始する方法を示しています。
... // Create the properties object to pass to the embeddable container: Map<String,Object> props = new HashMap<String,Object>(); // Specify the EJB modules to start when creating the container: File[] ejbModules = new File[2]; ejbModules[0] = new File("/home/myusername/ejbs/ShoppingCartEJB.jar"); ejbModules[1] = new File("/home/myusername/ejbs/OnlineCatalogEJB.jar"); props.put(EJBContainer.MODULES, ejbModules); // In this example, both of these modules rely on code in a shared library. // In order for the embeddable container to load the shared library, the // context classloader must be able to load that shared library. // Set up the context classloader so that it can load the shared library: File sharedLibUtilityFile = new File("/home/myusername/ejbs/SharedLib.jar"); ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); ClassLoader newCL = new URLClassLoader(new URL[]{ sharedLibUtilityFile.toURI().toURL()}, oldCL); Thread.currentThread().setContextClassLoader(newCL); // Now, create the embeddable container, passing it the properties map: EJBContainer ec = EJBContainer.createEJBContainer(props); // Invoke an EJB loaded by the embeddable container: ...
Bean インスタンスを検索したら、そのインスタンス上のメソッドを開始します。 コンテナー関連のタスクを完了したら、コンテナーを閉じます。 これにより、PreDestroy としてマークを付けられた Bean メソッドが開始され、組み込み可能コンテナーが閉じられます。 新しい組み込み可能コンテナーのインスタンスを作成する場合は、その前に組み込み可能コンテナーを閉じてください。
- 組み込み可能コンテナーをカスタマイズします。 プロパティーを使用して、組み込み可能 EJB コンテナー・ランタイムをカスタマイズできます。 サポートされているプロパティーの完全なリストは、『組み込み可能 EJB コンテナーのカスタム・プロパティー』トピックに記載されています。
- アプリケーションがデータ・ソースなどのリソースを使用するようにしたい場合は、組み込み可能コンテナーに渡されるプロパティー・マップ、またはプロパティー・ファイルで、それらのリソースを作成し、構成することができます。
組み込み可能 EJB コンテナーの一般的な使用法の 1 つは、最終的にアプリケーション・サーバーで稼働するアプリケーションをテストすることです。 このようなアプリケーションの多くは、管理コンソールまたは wsadmin スクリプト・ツールを使用してサーバーで構成される JDBC データ・ソースに依存しています。 これらのツールは組み込み可能コンテナーに存在しないため、プロパティーを組み込み可能コンテナーに渡すことによってリソースを提供するように WebSphere 組み込み可能コンテナーを構成することができます。
プロパティー・ファイルには、データ・ソースの構成プロパティーも保管できます。 組み込み可能コンテナーは、embeddable.properties というファイルに保管されたプロパティーを現行作業ディレクトリーに自動的にロードします。 このファイル・ロケーションをオーバーライドすることができます。その場合は、新しいファイル・ロケーションを com.ibm.websphere.embeddable.configFileName システム・プロパティーの値として指定します。
データ・ソース構成プロパティーはすべて DataSource で始まり、その後に、どのデータ・ソースを構成するかを識別する項目が続きます。 例えば、Datasource.myDataSource.someProperty は、Datasource.anotherDS.someOtherProperty というデータ・ソースとは異なるデータ・ソースに適用されます。 データ・ソース・プロパティーのリストは、組み込み可能 EJB コンテナーのカスタム・プロパティーに関する情報に記載されています。
アプリケーションでどのようにしてデータ・ソースを使用できるのかを示す例を以下に示します。
... InitialContext context = new InitialContext(); DataSource ds = (DataSource) context.lookup("env/jdbc/AcctsPayableDS"); Connection conn = ds.getConnection(); // Use the connection to access the AcctsPayableDS database ...
サーバーで、システム管理者がデータ・ソースを作成し、それを JNDI 名前空間内の env/jdbc/AcctsPayableDS にバインドしました。 あるいは、そのコードは env/jdbc/AcctsPayableDS にマップされる java:comp 名前空間で当該データ・ソースを検索したり、当該データ・ソースを注入する EJB フィールドを指定した可能性もあります。 どの場合でも、データ・ソースは名前空間でバインドされている必要があります。 このアクションは、以下のコードを使用して、組み込み可能コンテナー・インスタンスの作成時にプログラマチックに実行します。
... // Create a properties map to store embeddable container config properties Map<String,Object> props = new HashMap<String,Object>(); // Set the JNDI name to bind this data source: props.put("DataSource.ds1.name", "env/jdbc/AcctsPayableDS"); // Set the data source class name ; this is a required property // This example uses a Derby JDBC driver props.put("DataSource.ds1.dataSourceClass", "org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource"); // Set the database name props.put("DataSource.ds1.databaseName", "AcctsPayableTestDB"); // Create the embeddable container instance with our custom properties EJBContainer ec = EJBContainer.createEJBContainer(props); // Now invoke an EJB in the embeddable container... ...
上記のコードは、AcctsPayableTestDB という Apache Derby データベースの単純データ・ソースを作成し、それを env/jdbc/AcctsPayableDS でバインドします。 これと同じタスクを宣言的に実行することができます。その場合は、JVM の現行作業ディレクトリーにある embeddable.properties というファイルに次のテキストを挿入します。 また、このテキストを任意のテキスト・ファイルに挿入し、そのテキスト・ファイルを com.ibm.websphere.embeddable.configFileName システム・プロパティーで指定することもできます。
DataSource.ds1.name=env/jdbc/AcctsPayableDS DataSource.ds1.dataSourceClass=org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource DataSource.ds1.databaseName=AcctsPayableTestDB
直接データ・ソースを検索するのではなく、EJB の作成時にリソース参照を使用するようにします。
- アプリケーションは、Java EE ロール・ベース・セキュリティー (宣言とプログラマチックの両方) を使用して、EJB ロール・ベース・セキュリティーを検証することができます。 以下のアクションを実行して、EJB のロール・ベースのセキュリティーを検証できます。
- 許可目的で使用するユーザーを定義します。
- EJB で宣言されたロールにユーザーを割り当てます。
- EJB における EJBContext メソッドである isCallerInRole() および getCallerPrincipal() の使用をテストします。
アプリケーションでどのようにして宣言的セキュリティーおよびプログラマチック・セキュリティーを使用できるのかを示す例を以下に示します。
import java.util.HashMap; import java.util.Map; import javax.ejb.EJBContainer; import my.pkg.MyBeanIface; // this is the local business interface of the // enterprise bean public class EmbeddableContainerSample { public static void main(String[] args) throws Throwable { // Create a properties map to pass to the embeddable container: Map<String,Object> properties = new HashMap<String,Object>(); // Specify that you want to use the WebSphere embeddable container: properties.put(EJBContainer.PROVIDER, "com.ibm.websphere.ejbcontainer.EmbeddableContainerProvider"); // Specify that you want security checking enabled: properties.put("com.ibm.websphere.securityEnabled", "true"); // Assign the users bob, fred, and mary to the role employee: props.put("role.employee", "bob, fred, mary"); // Assign the user fred to the role manager: props.put("role.manager", "fred"); // The user fred will be used for the runAs role manager: props.put("role.runAs.manager", "fred"); // The user fred will be used for role authorization when invoking // methods on the EJB: props.put("user.invocation", "fred"); // Create the container instance, passing it the properties map: EJBContainer ec = EJBContainer.createEJBContainer(properties); // Use the container context to look up a bean: MyBeanIface bean = ec.getContext().lookup("java:global/MyEJBModule/MyBean!my.pkg.MyBeanIface"); // Invoke a method on the bean instance: bean.doStuff(); ... // Close the embeddable container: ec.close(); } }
上記のコードは、セキュリティーを使用可能にしてから、2 つのロール (employee および manager) と 3 人のユーザー (bob、mary、および fred) を作成します。 次に、manager ロールとして実行しているとき fred ユーザーを使用することを指定しています。 また、組み込み可能コンテナーを作成する前に、呼び出しユーザーを fred として設定します。 つまり、EJB メソッドが開始されるとき、これらは fred により開始されます。 これは、それらの EJB メソッドが employee または manager のロールを必要とする場合に、fred がそれらの EJB メソッドにアクセスできることを意味します。
- アプリケーションでは、Bean ごとにローカル・トランザクション内包 (LTC) の振る舞いを指定できます。
LTC については、ローカル・トランザクション内包に関する情報を参照してください。
アプリケーションが LTC リゾルバーおよび未解決アクションをどのように指定できるかの例を以下に示します。
import java.util.HashMap; import java.util.Map; import javax.ejb.EJBContainer; import my.pkg.MyBeanIface; // this is the local business interface // of the enterprise bean public class EmbeddableContainerSample { public static void main(String[] args) throws Throwable { // Create a properties map to pass to the embeddable container: Map<String,Object> properties = new HashMap<String,Object>(); // Specify that you want to use the WebSphere embeddable container: properties.put(EJBContainer.PROVIDER, "com.ibm.websphere.ejbcontainer.EmbeddableContainerProvider"); // Specify that you want the LTC resolver container-at-boundary: properties.put("Bean.myApp1#moduleA#bean101.LocalTransaction.Resolver", "ContainerAtBoundary"); // Specify that you want the LTC unresolved action commit: properties.put("Bean.myApp1#moduleA#bean101.LocalTransaction.UnresolvedAction", "Commit"); // Create the container instance, passing it the properties map: EJBContainer ec = EJBContainer.createEJBContainer(properties); // Use the container context to look up a bean: MyBeanIface bean = ec.getContext().lookup("java:global/MyEJBModule/MyBean!my.pkg.MyBeanIface"); // Invoke a method on the bean instance: bean.doStuff(); ... // Close the embeddable container: ec.close(); } }
上記のコードは、指定された Bean に対するリゾルバー・アクションを非デフォルト値の container-at-boundary に設定し、さらに、未解決アクションがトランザクションをコミットする非デフォルト・アクションになるようにします。
組み込み可能コンテナーの起動時にアプリケーション名が指定されない場合は、<application_name> を省略する必要があります。ただし、区切り文字の # を使用する必要があります。以下に例を示します。properties.put("Bean.#moduleA#bean101.LocalTransaction.UnresolvedAction", "Commit");
サブトピック
埋め込み可能 EJB コンテナー
埋め込み可能 Enterprise JavaBeans (EJB) コンテナーは、Java Platform, Enterprise Edition (Java EE) を必要としないエンタープライズ Bean 用のコンテナーです。組み込み可能コンテナーの実行
このタスクを使用して、組み込み可能コンテナーを実行します。組み込み可能コンテナーで稼働するアプリケーションは、完全アプリケーション・サーバーで稼働するときよりも開始時間が短縮され、必要な占有スペースも少なくなります。 これは、最終的にアプリケーション・サーバーで稼働する可能性があるアプリケーションの迅速な開発とテストに理想的な環境です。組み込み可能 EJB コンテナーの機能
Enterprise JavaBeans (EJB) 3.2 仕様によると、ベンダーが使用するすべての組み込み可能 EJB コンテナーには、EJB 機能の EJB Lite サブセットが少なくとも実装されている必要があります。また、アプリケーション・サーバーには、EJB Lite サブセットをサポートする追加機能も組み込まれています。 詳しくは、EJB 3.2 の仕様書を参照してください。組み込み可能 EJB コンテナーの構成プロパティー
組み込み可能な Enterprise JavaBeans (EJB) コンテナーに、以下の構成プロパティーを使用します。埋め込み可能 EJB コンテナー
埋め込み可能 Enterprise JavaBeans (EJB) コンテナーは、Java Platform, Enterprise Edition (Java EE) を必要としないエンタープライズ Bean 用のコンテナーです。組み込み可能コンテナーの実行
このタスクを使用して、組み込み可能コンテナーを実行します。組み込み可能コンテナーで稼働するアプリケーションは、完全アプリケーション・サーバーで稼働するときよりも開始時間が短縮され、必要な占有スペースも少なくなります。 これは、最終的にアプリケーション・サーバーで稼働する可能性があるアプリケーションの迅速な開発とテストに理想的な環境です。組み込み可能 EJB コンテナーの機能
Enterprise JavaBeans (EJB) 3.2 仕様によると、ベンダーが使用するすべての組み込み可能 EJB コンテナーには、EJB 機能の EJB Lite サブセットが少なくとも実装されている必要があります。また、アプリケーション・サーバーには、EJB Lite サブセットをサポートする追加機能も組み込まれています。 詳しくは、EJB 3.2 の仕様書を参照してください。組み込み可能 EJB コンテナーの構成プロパティー
組み込み可能な Enterprise JavaBeans (EJB) コンテナーに、以下の構成プロパティーを使用します。


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_dvemcontainer
ファイル名:tejb_dvemcontainer.html