サーブレット、JSP ファイル、スタンドアロン・プログラム、またはその他のクライアントから、エンタープライズ Bean にアクセスできない
これらのトラブルシューティングのヒントは、エンタープライズ Bean へのアクセスに関連する問題に使用します。
- java.lang.NoSuchMethodError メッセージ
- アクセスしようとすると、「javax.naming.NameNotFoundException: Name name not found in context "local" message」というメッセージが出る
- BeanNotReentrantException がスローされた
- CSITransactionRolledbackException / TransactionRolledbackException がスローされた。
- 呼び出しが失敗し、「EJSContainer E Bean method threw exception [exception_name]」で始まるスタック・トレースが JVM ログ・ファイルに記録された。
- 呼び出しが失敗し、ステートフル・セッション EJB へのアクセス時に、ObjectNotFoundException または ObjectNotFoundLocalException が JVM ログ・ファイルに記録された。
- "javax.naming.NameNotFoundException dataSourceName_CMP" 例外で EJB モジュールの始動に失敗した
EJB へのアクセス中に、「Transaction [tran ID] has timed out after 120 seconds」というエラーが発生した。
メッセージ BBOT0003W が発行された。
- 症状: CNTR0001W: Stateful SessionBean を非活性化できなかった
症状: EJB メソッドを実行しようとして、「org.omg.CORBA.BAD_PARAM: Servant is not of the expected type. minor code: 4942F21E completed: No」がクライアント・プログラムに戻された
クライアントがエンタープライズ Bean に対してリモートである場合、つまり別のアプリケーション・サーバーで実行されているか、スタンドアロンのクライアントとして実行されている場合は、そのクライアントのログ・ファイルのみでなく、エンタープライズ Bean をホスティングしているアプリケーション・サーバーの
JVM ログも参照します。
クライアントがエンタープライズ Bean
に対してリモートである場合、つまり別のアプリケーション・サーバーで実行されているか、スタンドアロンのクライアントとして実行されている場合は、そのクライアントのログ・ファイルのみでなく、エンタープライズ Bean をホスティングしているアプリケーション・サーバーのログも参照します。
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
- 問題がネーム・サービスに関連している場合、つまり NameNotFoundException エラーが出されるか、NMSV で始まるメッセージ ID が表示される場合は、以下のトピックで詳しい情報を参照してください。
- 問題の診断および修正: 学習用リソースのリンクを使用して、 問題が特定され、文書化されているかどうかを確認してください。
java.lang.NoSuchMethodError
セッション Bean でメソッドを呼びだそうとして、java.lang.NoSuchMethodError が生じました。
Bean に対してメソッド xSLTStory4Session を呼びだそうとしたとき、java.lang.NoSuchMethodError が表示されました。
CNTR0020E: Bean "BeanId(ERWW_v8#XSLTStory4SessionEJB3.jar#XSLTStory4SessionFacadeBean, null)" に対するメソッド "xSLTStory4Session" の呼び出し時に EJB が予期しない (宣言されていない) 例外をスローしました。
例外データ: java.lang.NoSuchMethodError: paysession/ejb3/PaySessionFacadeRemote.paySession(Ljava/lang/String;)Ljava/lang/String;
この場合、EAR ファイル内の複数のモジュールに、PaySessionFacadeRemote インターフェースの複数のバージョンが存在します。 インターフェースの 1 つに、予期されるメソッドが含まれていません。
ランタイムによって、EAR ファイルのクラスパスにある PaySessionFacadeRemote インターフェースの最初のバージョンからスタブ・クラスが生成されましたが、それは正しくないバージョンでした。
ステートフル・セッション EJB へのアクセス時の ObjectNotFoundException または ObjectNotFoundLocalException
この問題は、ステートフル・セッション Bean がタイムアウトになり、コンテナーによって除去されたことが原因と考えられます。 このイベントは、EJB 2.1 以降の仕様に従って、コード内で対処する必要があります。
JVM ログ・ファイルで、「EJSContainer E Bean method threw exception [exception_name]」で 始まるスタック・トレースが検出された
例外名が、IBM クラスによってスローされた例外、 つまり"com.ibm..."で始まる例外を示している場合は、インフォメーション・センター内、 および以下に記載されているオンライン・ヘルプで、その例外名を検索します。 「例外名」が、アプリケーションからスローされた例外を示している場合は、 そのアプリケーションの開発者に問い合わせて、原因を判別してください。
javax.naming.NameNotFoundException: コンテキスト"local"内に、名前 "name" が見つからない
この例外の原因としては、エンタープライズ Bean が、クライアント JSP、 サーブレット、Java アプリケーション、またはその他のエンタープライズ Bean に対してローカルでない (同じ Java 仮想マシン [JVM]、またはアプリケーション・サーバー内で稼働していない) にもかかわらず、呼び出しが 、エンタープライズ Bean の「ローカル」インターフェース・メソッドに対するものである、ということが考えられます。 例えば、開発環境ではアクセスできたにもかかわらず、WebSphere Application Server にデプロイしたときにアクセスできなくなった場合は、エンタープライズ Bean およびそのクライアントが、開発時には同一の JVM にあったが、 デプロイメント後は別個のプロセス内に配置されたというケースが考えられます。
この問題を解決するには、エンタープライズ Bean の開発者に問い合わせて、 そのクライアント呼び出しが、エンタープライズ Bean のローカル・インターフェース内のメソッドに対するものかどうかを判別してください。 そうである場合は、クライアント・コードを、 リモート・インターフェース・メソッドを呼び出すように変更するか、 または、そのローカル・メソッドをリモート・インターフェース内にプロモートします。
ローカル・インターフェースを持つエンタープライズ Bean への参照は、
サーバー・プロセスに対しローカルである、URL スキームが local: の名前空間で
バインドします。サーバーの local: 名前空間のダンプを取得するには、項目
"java:、local:、および server 名前空間の名前空間ダンプ・ユーティリティー" で説明されている名前空間ダンプ・ユーティリティーを使用します。
BeanNotReentrantException がスローされた
この問題の原因は、クライアント・コード (通常はサーブレットまたは JSP ファイル) が、 異なる 2 つのクライアント・スレッドから同一の Stateful SessionBean を呼び出そうとすることにあると考えられます。 この状態が頻繁に発生するのは、 アプリケーションが、Stateful SessionBean への参照を静的変数内に保管して、 グローバル (静的) JSP 変数を使用して Stateful SessionBean 参照を参照する場合、 あるいは Stateful SessionBean 参照を HTTP セッション・オブジェクト内に保管する場合です。 その後アプリケーションは、前の要求が完了する前に、 クライアント・ブラウザーを介して、サーブレットまたは JSP ファイルに対する新規の要求を発行させます。
この問題を解決するには、そのクライアント・コードの開発者に問い合わせて、 これらの条件に当てはまるかどうか、コードを確認してください。
CSITransactionRolledbackException / TransactionRolledbackException がスローされた
エンタープライズ Bean コンテナーは、このような高水準の例外を作成して
、エンタープライズ Bean 呼び出しが完了しなかったことを示します。
この例外がスローされた場合は、JVM ログを参照して、根底にある原因を判別してください。
エンタープライズ Bean コンテナーは、このような高水準の例外を作成して
、エンタープライズ Bean 呼び出しが完了しなかったことを示します。
この例外がスローされた場合は、ログを参照して、根底にある原因を判別してください。
- エンタープライズ Bean が、 メソッド・シグニチャーの一部として宣言されていなかった例外をスローする場合があります。 この場合、コンテナーは、トランザクションをロールバックする必要があります。 この状態の一般的な原因は、呼び出されるエンタープライズ Bean またはコードが 、NullPointerException、ArrayIndexOutOfBoundsException、またはその他の Java ランタイム例外を作成する点にあるか、または BMP Bean が JDBC エラーを検出する点にあります。 解決策は、エンタープライズ Bean コードを詳しく調べて、原因となっている例外を解決するか、 または問題となっているメソッドのシグニチャーに例外を追加することです。
- トランザクションが、「Marked Rollback」、「RollingBack」、 または「RolledBack」状態に置かれた後に、追加処理を行おうとする場合があります。 トランザクションは、これらのいずれか 1 つの状態に設定された後は、処理を継続することはできません。 この状態は、トランザクションのタイムアウトが原因で発生します。 また、トランザクションのタイムアウトは、データベースのデッドロックが原因でしばしば発生します。 アプリケーションのデータベース管理ツールを用いて作業するか、または管理者と協力して 、エンタープライズ Bean によって呼び出されたデータベース・トランザクションが、 タイムアウト中であるかどうかを判断してください。
- トランザクションは、ローカル・トランザクションからの未解決の処理のためにコミットに失敗することがあります。 ローカル・トランザクションが、コミット中に何らかの「未解決の処理」を検出したということです。ローカル・トランザクションが「未解決のアクション」を検出した場合のデフォルトのアクションは、「ロールバック」です。アセンブリー・ツールで、このアクションを「コミット」に調整することができます。
"javax.naming.NameNotFoundException dataSourceName_CMP" 例外で EJB モジュールの始動に失敗した
- DataSource リソースを構成した時に、コンテナー管理パーシスタンスを選択しませんでした。
- この問題を確認するには、管理コンソールで、NameNotFoundException 内に定義されたデータ・ソースのプロパティーをブラウズします。「構成」パネルで、 「コンテナー管理パーシスタンス」というラベルの付いたチェック・ボックスを探します。
- この問題を解決するには、「コンテナー管理パーシスタンス」のチェック・ボックスを選択します。
- コンテナー管理パーシスタンスが選択されている場合は、CMP DataSource
が名前空間にバインドされなかった可能性があります。
ステータス・バー、およびホスティング・アプリケーション・サーバーの JVM ログに、ネーミング関連の警告かエラーがほかにないかどうかを調べます。 ネーミング例外の問題がほかにあるかどうかを調べるには、 トピックアプリケーション・アクセスの問題を参照してください。
ステータス・バー、およびホスティング・アプリケーション・サーバーのログに、ネーミング関連の警告かエラーがほかにないかどうかを調べます。 ネーミング例外の問題がほかにあるかどうかを調べるには、 トピックアプリケーション・アクセスの問題を参照してください。
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
エンタープライズ Bean へのアクセス中に「Transaction [tran ID] has timed out after 120 seconds」というエラーが発生する
- エンタープライズ Bean トランザクション用のタイムアウトのデフォルト値は 120 秒です。 この時間が経過すると、トランザクションはタイムアウトになり、接続がクローズされます。
- 指定したタイムアウト期間よりも長くトランザクションを実行する場合は、 「server_name」と移動し、 「Transaction Service properties」ページを選択して、 プロパティー「合計トランザクション存続時間タイムアウト」を表示します。 必要に応じてこの値を増やし、 その構成を保存します。
![[z/OS]](../images/ngzos.gif)
メッセージ BBOT0003W が発行された
- エンタープライズ Bean トランザクション用のタイムアウトのデフォルト値は 120 秒です。 この時間が経過すると、トランザクションはタイムアウトになり、接続がクローズされます。
- 指定されたタイムアウト期間よりも長くトランザクションを実行する場合は、
管理コンソール上で以下を行います。
- と進みます。
- 「Transaction Service properties」ページを選択します。
- 「Total transaction lifetime timeout」値を増やします。
- 構成を「保存」します。
注: z/OS は、 ユーザーが「Total transaction lifetime timeout」に対して設定する値を、 デフォルトのトランザクション・タイムアウト設定値として使用します。 ユーザーがこのプロパティーに対して設定した値がトランザクションの最大タイムアウト値を超えている場合 、z/OS はトランザクションの最大タイムアウト値をデフォルトとして使用します。
症状: CNTR0001W: Stateful SessionBean を非活性化できなかった
このエラーは、Bean 内で使用されている接続オブジェクトがクローズされていなかったか、 またはヌルになっていなかった場合に発生することがあります。
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
[time EDT] <ThreadID> StatefulPassi W CNTR0001W:
A Stateful SessionBean could not be passivated: StatefulBeanO
(BeanId(XXX#YYY.jar#ZZZZ, <ThreadID>),
state = PASSIVATING) com.ibm.ejs.container.passivator.StatefulPassivator@<ThreadID>
java.io.NotSerializableException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at java.io.ObjectOutputStream.outputClassFields((Compiled Code))
at java.io.ObjectOutputStream.defaultWriteObject((Compiled Code))
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at com.ibm.ejs.container.passivator.StatefulPassivator.passivate((Compiled Code))
at com.ibm.ejs.container.StatefulBeanO.passivate((Compiled Code)
at com.ibm.ejs.container.activator.StatefulASActivationStrategy.atUnitOfWorkEnd((Compiled Code))
at com.ibm.ejs.container.activator.Activator.unitOfWorkEnd((Compiled Code))
at com.ibm.ejs.container.ContainerAS.afterCompletion((Compiled Code)
ここで、XXX、YYY、ZZZ は Bean 名、<ThreadID> はその実行のスレッド ID です。![[z/OS]](../images/ngzos.gif)
StatefulPassi W CNTR0001W:
A Stateful SessionBean could not be passivated: StatefulBeanO
(BeanId(XXX#YYY.jar#ZZZZ),
state = PASSIVATING)
java.io.NotSerializableException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at java.io.ObjectOutputStream.outputClassFields((Compiled Code))
at java.io.ObjectOutputStream.defaultWriteObject((Compiled Code))
at java.io.ObjectOutputStream.outputObject((Compiled Code))
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code))
at com.ibm.ejs.container.passivator.StatefulPassivator.passivate((Compiled Code))
at com.ibm.ejs.container.StatefulBeanO.passivate((Compiled Code)
at com.ibm.ejs.container.activator.StatefulASActivationStrategy.atUnitOfWorkEnd((Compiled Code))
at com.ibm.ejs.container.activator.Activator.unitOfWorkEnd((Compiled Code))
at com.ibm.ejs.container.ContainerAS.afterCompletion((Compiled Code)
ここで、XXX、YYY、ZZZ は Bean 名です。この問題を 訂正するには、アプリケーションですべての接続をクローズし、すべての接続に対する参照をヌルに設定する 必要があります。 通常、このアクティビティーは Bean の ejbPassivate() メソッド内で行われます。 また、この Bean は、再活性化されたときに、これらの接続を再獲得するようコード化する必要があります。 これを行わないと、アプリケーションが接続を再使用しようとしたときに NullPointerExceptions が発生します。
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
Symptom: org.omg.CORBA.BAD_PARAM: Servant is not of the expected type. minor code: 4942F21E completed: No
このエラーは、 プログラムが EJB メソッドを実行しようとしたときに、クライアント・プログラムに戻されることがあります。
一般に、この問題は、インターフェース定義と、クライアントとサーバーのインストールの実装との間に不一致があるときに生じます。
考えられる別の原因は、 アプリケーション・サーバーが単一のクラス・ロード・スキームを使用するようにセットアップされている場合です。 アプリケーション・サーバーがアクティブであるときにアプリケーションをアンインストールすると、 アンインストールされたアプリケーションのクラスは、そのアプリケーション・サーバー内でロードされたままになります。 アプリケーションを変更し、 アプリケーション・サーバーにそのアプリケーションを再デプロイしてから再インストールすると、 以前にロードされたクラスは、バックレベルになります。 バックレベル・クラスは、クライアントとサーバーの間のコード・バージョンのミスマッチの原因となります。
- アプリケーション・サーバーのクラス・ロード・スキームを multiple に変更する。
- アプリケーション・サーバーを停止してから再始動し、操作を再試行する。
- クライアントとサーバーのコード・バージョンが同じになるようにする。