WebSphere Application Server Version 6.1 Feature Pack for Web Services   
             オペレーティング・システム: AIX , HP-UX, i5/OS, Linux, Solaris, Windows, Windows Vista, z/OS

             目次と検索結果のパーソナライズ化

サーブレット、JSP ファイル、スタンドアロン・プログラム、またはその他のクライアントから、エンタープライズ Bean にアクセスできない

この項目では、エンタープライズ Bean へのアクセスに関連する問題のトラブルシューティングのヒントを提供しています。

どのようなエラーが発生しましたか?

[AIX HP-UX Linux Solaris Windows] [i5/OS] クライアントがエンタープライズ Bean に対してリモートである場合、つまり別のアプリケーション・サーバーで実行されているか、スタンドアロンのクライアントとして実行されている場合は、そのクライアントのログ・ファイルのみでなく、エンタープライズ Bean をホストしているアプリケーション・サーバーの JVM ログも参照します。

[z/OS] クライアントがエンタープライズ Bean に対してリモートである場合、つまり別のアプリケーション・サーバーで実行されているか、スタンドアロンのクライアントとして実行されている場合は、そのクライアントのログ・ファイルのみでなく、エンタープライズ Bean をホストしているアプリケーション・サーバーのログも参照します。

ステートフル・セッション EJB へのアクセス時の ObjectNotFoundException または ObjectNotFoundLocalException

この問題は、ステートフル・セッション Bean がタイムアウトになり、コンテナーによって除去されたことが原因と考えられます。 このイベントは、EJB 2.1 仕様 (http://java.sun.com/products/ejb/docs.html で入手可能) のセクション 7.6.2『Dealing with exceptions』に従って、コード内で対処する必要があります。

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: のネーム・スペースで バインドします。

BeanNotReentrantException がスローされた

この問題の原因は、クライアント・コード (通常はサーブレットまたは JSP ファイル) が、 異なる 2 つのクライアント・スレッドから同一の Stateful SessionBean を呼び出そうとすることにあると考えられます。 この状態が頻繁に発生するのは、 アプリケーションが、Stateful SessionBean への参照を静的変数内に保管して、 グローバル (静的) JSP 変数を使用して Stateful SessionBean 参照を参照する場合、 あるいは Stateful SessionBean 参照を HTTP セッション・オブジェクト内に保管する場合です。 その後アプリケーションは、前の要求が完了する前に、 クライアント・ブラウザーを介して、サーブレットまたは JSP ファイルに対する新規の要求を発行させます。

この問題を解決するには、そのクライアント・コードの開発者に問い合わせて、 これらの条件に当てはまるかどうか、コードを確認してください。

CSITransactionRolledbackException / TransactionRolledbackException がスローされた

[AIX HP-UX Linux Solaris Windows] [i5/OS] エンタープライズ Bean コンテナーは、このような高水準の例外を作成して 、エンタープライズ Bean 呼び出しが正常に完了できなかったことを示します。 この例外がスローされた場合は、JVM ログを参照して、根底にある原因を判別してください。

[z/OS] エンタープライズ Bean コンテナーは、このような高水準の例外を作成して 、エンタープライズ Bean 呼び出しが正常に完了できなかったことを示します。 この例外がスローされた場合は、ログを参照して、根底にある原因を判別してください。

次のような原因が考えられます。
  • Enterprise Bean が、 メソッド・シグニチャーの一部として宣言されていなかった例外をスローする場合があります。 この場合、コンテナーは、トランザクションをロールバックする必要があります。 この状態の一般的な原因は、呼び出されるエンタープライズ Bean またはコードが 、NullPointerException、ArrayIndexOutOfBoundsException、またはその他の Java ランタイム例外を作成する点にあるか、または BMP Bean が JDBC エラーを検出する点にあります。 解決策は、Enterprise Bean コードを詳しく調べて、原因となっている例外を解決するか、 または問題となっているメソッドのシグニチャーに例外を追加することです。
  • トランザクションが、「Marked Rollback」、「RollingBack」、 または「RolledBack」状態に置かれた後に、追加処理を行おうとする場合があります。 トランザクションは、これらのいずれか 1 つの状態に設定された後は、処理を継続することはできません。 この状態は、トランザクションのタイムアウトが原因で発生します。 また、トランザクションのタイムアウトは、データベースのデッドロックが原因でしばしば発生します。 アプリケーションのデータベース管理ツールを用いて作業するか、または管理者と協力して 、Enterprise Bean によって呼び出されたデータベース・トランザクションが、 タイムアウト中であるかどうかを判断してください。
  • トランザクションは、ローカル・トランザクションからの未解決の処理のためにコミットに失敗することがあります。 ローカル・トランザクションが、コミット中に何らかの「未解決の処理」を検出したということです。 ローカル・トランザクションが「未解決のアクション」を検出した場合のデフォルトのアクションは、 「ロールバック」です。 アセンブリー・ツールで、このアクションを「コミット」に調整することができます。 Enterprise Bean の .jar ファイル (または Enterprise Bean を含む EAR ファイル) を開き、 左側のコンポーネント・ツリー内の Session Beans または Entity Beans オブジェクトを選択します。 「未解決のアクション」プロパティーは、コンテナー・プロパティーの「IBM 拡張」タブにあります。

"javax.naming.NameNotFoundException dataSourceName_CMP" 例外で EJB モジュールの始動に失敗した

このエラーが発生する理由としては、 次のようなものがあります。
  • DataSource リソースを構成した時に、コンテナー管理パーシスタンスを選択しませんでした。
    • この問題を確認するには、管理コンソールで、NameNotFoundException 内に定義されたデータ・ソースのプロパティーをブラウズします。「構成」パネルで、 「コンテナー管理パーシスタンス」というラベルの付いたチェック・ボックスを探します。
    • この問題を解決するには、「コンテナー管理パーシスタンス」のチェック・ボックスを選択します。
  • コンテナー管理パーシスタンスが選択されている場合は 、CMP DataSource がネーム・スペースにバインドできなかった可能性があります。
    • [AIX HP-UX Linux Solaris Windows] [i5/OS] ステータス・バー、およびホスティング・アプリケーション・サーバーの JVM ログに、ネーミング関連の警告かエラーがほかにないかどうかを調べます。 ネーミング例外の問題がほかにあるかどうかを調べるには、 トピックアプリケーション・アクセスの問題 を参照してください。
    • [z/OS] ステータス・バー、およびホスティング・アプリケーション・サーバーのログに、ネーミング関連の警告かエラーがほかにないかどうかを調べます。 ネーミング例外の問題がほかにあるかどうかを調べるには、 トピックアプリケーション・アクセスの問題 を参照してください。

症状: CNTR0001W: Stateful SessionBean を非活性化できなかった

このエラーは、Bean 内で使用されている接続オブジェクトがクローズされていなかったか、 またはヌルになっていなかった場合に発生することがあります。

[AIX HP-UX Linux Solaris Windows] [i5/OS] これを確認するには、エンタープライズ Bean をホストしている EJB コンテナーの JVM ログ内で以下のような例外スタックを探します。
[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] これを確認するには、エンタープライズ Bean をホストしている EJB コンテナーのログ内で以下のような例外スタックを探します。
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 の仕様 (具体的には EJB 仕様バージョン 2.1 の 7.4 節) を参照してください。 また、この Bean は、再活性化されたときに、これらの接続を再獲得するようコード化する必要があります。 これを行わないと、アプリケーションが接続を再使用しようとしたときに NullPointerExceptions が発生します。




関連タスク
EJB モジュールのアセンブル
参照トピック    

ご利用条件 | フィードバック

最終更新: Jan 21, 2008 4:10:06 PM EST
http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.wsfep.multiplatform.doc/info/ae/ae/rtrb_ejbaccessprobs.html