7. EJBコンテナ

EJBコンテナの注意・制限事項について説明します。

7.1. 注意事項

7.1.1. EJBクライアントアプリケーションのコンパイル・実行について

クライアントアプリケーションのコンパイルおよび、実行時には、WebOTXサーバ製品または「WebOTX Client」をインストールする必要があります。 必要なクラスパスやJava起動時のシステムプロパティの設定に関しての詳細は、[ アプリケーション開発 > その他のアプリケーション > プログラミング・開発ガイド > EJBクライアント ]を参照してください。

7.1.2. サーバとクライアントのJava VMのバージョン

EJBを配備するサーバとEJBクライアントで使用するJava VMのバージョンは、マイナーバージョンレベルまで一致させる必要があります。

7.1.3. タイマーBeanの使用について

EJB 2.1仕様で追加されたタイマーBeanの機能はデータベースを使用するため、デフォルトでは使用できません。

[ リファレンス > 設定 > EJBコンテナ > タイマBeanの使用方法について ] を参照してデータソースとデータベースのテーブル追加を行なってください。

7.1.4. JavaのDate型かTime型をフィールドに持つCMPについて

CMPフィールドがJavaのDate型かTime型(java.util.Date, java.sql.Date,java.sql.Time, java.sql.Timestamp)である場合、フィールドの値がデータベースの値と完全には一致しなくなることがあります。

例えば、以下のコードは主キーフィールドとしてjava.sql.Date型を使います。

java.sql.Date myDate = new java.sql.Date(System.currentTimeMillis())beanHome.create(myDate, ...);

データベースによっては、このコードはデータベースにフィールドの値の年、月、および日付の部分だけを保存します。以下のようにクライアントがこのBeanを主キーによって見つけようとすると

myBean = beanHome.findByPrimaryKey(myDate);

そのBeanはデータベース中から見つけることはできません。値がデータベースに保存された値と一致しないからです。

保存している間に、データベースがタイムスタンプ値を切り捨てるか、またはカスタムクエリにwhere節において日付か時間値の比較がある場合、同様の問題が起こる可能性があります。

自動マッピングとオラクルデータベースを使用すると、タイプjava.util.Date、java.sql.Date、java.sql.Time、およびjava.sql.TimestampのすべてのフィールドがオラクルのDATEデータ型にマッピングされます。

7.1.5. JDK 11 の環境でEJBの静的スタブ生成機能とCMPアプリケーションを使用する場合について

ドメインディレクトリの config/server.policy に定義を追加し、権限を追加する必要があります。ドメインが停止した状態で、server.policy ファイルを開き、以下のコメンアウトを外してください。


// grant codeBase "jrt:/jdk.compiler" {
//    permission java.lang.RuntimePermission "closeClassLoader";
//    permission java.lang.RuntimePermission "createClassLoader";
//    permission java.lang.RuntimePermission "getenv.JDK_JAVAC_OPTIONS";
// };

7.1.6. 内部クラスを含むEJBの静的スタブの生成について

EJBアプリケーションを配備する際に、--rmic=true オプションを付けることで、 RMIのスタブとスケルトンを静的に生成することができます。 しかし、EJBのリモートインタフェースのメソッドの戻り値あるいは引数に内部クラス型がある場合は、 スタブの生成に失敗します。

この注意事項に該当する場合は、--rmic=true オプションを付けずに EJBアプリケーションを配備してください。 これにより、スタブはEJB呼び出し時にProxyオブジェクトを使用して動的に生成されるようになります。

また、-Dwebotx.deploy.replaceInnerClassSeparator=true を エージェントプロセスのシステムプロパティに指定することで、 リモートインタフェースのメソッドの戻り値あるいは引数に内部クラス型がある EJBアプリケーションを--rmic=true オプションを付けて配備することができます。

7.2. 制限事項

7.2.1. 複数のエンドポイントを持つEJBのアーカイブについてSTD

Standardエディションにおいて、WebOTX DeveloperでWebサービスエンドポイント複数含むEJBをひとつのアーカイブで作成し、配備した場合、そのうちのひとつしか呼び出すことができません。別アーカイブに分けてアプリケーションを作成するようにしてください。

7.2.2. EJBコンストラクタから"java:comp/env"コンテキストへのJNDIアクセスについて

EJB仕様では、Enterprise Beanのコンストラクタで"java:comp/env"コンテキストへのJNDIアクセスを許可していませんが、WebOTXのEJBコンテナではJNDIアクセスが可能になっています。

7.2.3. 名前サーバに登録されたUserTransactionオブジェクト参照の取得について

EJB仕様では、コンテナ管理によるトランザクション設定を持つEnterprise Beanが、名前サーバに登録されたUserTransactionオブジェクト参照をlookup()メソッド使用して取得することを許可していませんが、WebOTXではlookup()メソッドによるアクセスが可能になっています。

7.2.4. remove()メソッド実行後のステートレスSession Beanの呼び出しについて

ステートレスSession Beanがremove()メソッドを呼び出した後に、Beanのメソッドを呼び出しても例外が発生しません。

7.2.5. ステートフルSession BeanのEJBContextクラスのメソッド呼び出しについて

ステートフルSession Beanで、ejbActivate()とejbPassivate()メソッド内から、EJBContextクラスのisCallerInRole()とgetCallerPrincipal()メソッドを呼び出すことはできません。

7.2.6. javax.naming.InitialContextオブジェクトの呼び出し可能メソッドについて

EJB仕様では、Enterprise Bean内部でjavax.naming.InitialContextオブジェクトを取得したとき、そのオブジェクトのlookup()メソッドのみを呼び出し可能としていますが、WebOTXのEJBコンテナではそのオブジェクトのlookup()メソッド以外も呼び出し可能になっています。

7.2.7. remove()メソッド実行後のステートレスSession Beanの呼び出しについて

ステートフルSession Beanで、ejbActivate()とejbPassivate()メソッド内から、EJBContextクラスのisCallerInRole()とgetCallerPrincipal()メソッドを呼び出すことはできません。

7.2.8. CMPナビゲーションをwhere節に含むEJB QLついて

EJB QLのwhere 節に OR 演算子と単一値の CMPナビゲーションが含まれる場合、クエリの検索結果が実際の検索結果よりも不足する場合があります。

この場合は、OR演算子で結合されている演算を別々のEJB QLとして定義し、別々に検索を行って結果をマージするようにEJBの処理を修正してください。

7.2.9. RMI-IIOPのダイナミック・プロキシ使用時の制限事項

Ver6.3よりEJBの通信プロトコルであるRMI-IIOP通信モードに関して、ダイナミック・プロキシを使用するモードが追加されました。配備オプションでダイナミック・プロキシを使用するかどうかを指定できますが、既定値ではダイナミック・プロキシで動作します。ダイナミック・プロキシを使用してEJB間の呼び出しを行う場合、いくつか制限事項があります。詳しくは [ CORBA通信基盤(Object Broker) > 制限事項(Java) > RMI-IIOP のダイナミック・プロキシによる通信モード使用時の制限事項 ] を参照してください。

7.2.10. EJBアプリケーションのローカル呼び出しについて

EJB 3.x でビジネスインタフェースを含むライブラリを共通で参照可能な場所 ([DOMAIN]/lib など) に配置した場合、ローカル呼び出しの条件に合致しますが、リモート呼び出しになります。

7.2.11. クラスローダのインスタンスの一時的な残存について

配備解除したEJBアプリケーションのクラスローダのインスタンスが一時的に残存します。ただし、他のEJBアプリケーションのビジネスメソッドが実行される際に、該当スレッドが再利用されれば、事象は解消します。