この項目では、エンタープライズ Bean へのアクセスに関連する問題のトラブルシューティングのヒントを提供しています。
クライアントがエンタープライズ Bean に対してリモートである場合、つまり別のアプリケーション・サーバーで実行されているか、スタンドアロンのクライアントとして実行されている場合は、そのクライアントのログ・ファイルのみでなく、エンタープライズ Bean をホストしているアプリケーション・サーバーの JVM ログも参照します。
クライアントがエンタープライズ Bean に対してリモートである場合、つまり別のアプリケーション・サーバーで実行されているか、スタンドアロンのクライアントとして実行されている場合は、そのクライアントのログ・ファイルのみでなく、エンタープライズ Bean をホストしているアプリケーション・サーバーのログも参照します。
この問題は、ステートフル・セッション Bean がタイムアウトになり、コンテナーによって除去されたことが原因と考えられます。 このイベントは、EJB 2.1 仕様 (http://java.sun.com/products/ejb/docs.html で入手可能) のセクション 7.6.2『Dealing with exceptions』に従って、コード内で対処する必要があります。
例外名が、IBM クラスによってスローされた例外、 つまり "com.ibm..." で始まる例外を示している場合は、インフォメーション・センター内、 および以下に記載されているオンライン・ヘルプで、その例外名を検索します。 「例外名」が、アプリケーションからスローされた例外を示している場合は、 そのアプリケーションの開発者に問い合わせて、原因を判別してください。
この例外の原因としては、エンタープライズ Bean が、クライアント JSP、 サーブレット、Java アプリケーション、またはその他のエンタープライズ Bean に対してローカルでない (同じ Java 仮想マシン [JVM]、またはアプリケーション・サーバー内で稼働していない) にもかかわらず、呼び出しが 、エンタープライズ Bean の「ローカル」インターフェース・メソッドに対するものである、ということが考えられます。 例えば、開発環境ではアクセスできたにもかかわらず、WebSphere Application Server にデプロイしたときにアクセスできなくなった場合は、エンタープライズ Bean およびそのクライアントが、開発時には同一の JVM にあったが、 デプロイメント後は別個のプロセス内に配置されたというケースが考えられます。
この問題を解決するには、エンタープライズ Bean の開発者に問い合わせて、 そのクライアント呼び出しが、エンタープライズ Bean のローカル・インターフェース内のメソッドに対するものかどうかを判別してください。 そうである場合は、クライアント・コードを、 リモート・インターフェース・メソッドを呼び出すように変更するか、 または、そのローカル・メソッドをリモート・インターフェース内にプロモートします。
ローカル・インターフェースを持つエンタープライズ Bean への参照は、 サーバー・プロセスに対しローカルである、URL スキームが local: のネーム・スペースで バインドします。
この問題の原因は、クライアント・コード (通常はサーブレットまたは JSP ファイル) が、 異なる 2 つのクライアント・スレッドから同一の Stateful SessionBean を呼び出そうとすることにあると考えられます。 この状態が頻繁に発生するのは、 アプリケーションが、Stateful SessionBean への参照を静的変数内に保管して、 グローバル (静的) JSP 変数を使用して Stateful SessionBean 参照を参照する場合、 あるいは Stateful SessionBean 参照を HTTP セッション・オブジェクト内に保管する場合です。 その後アプリケーションは、前の要求が完了する前に、 クライアント・ブラウザーを介して、サーブレットまたは JSP ファイルに対する新規の要求を発行させます。
この問題を解決するには、そのクライアント・コードの開発者に問い合わせて、 これらの条件に当てはまるかどうか、コードを確認してください。
エンタープライズ Bean コンテナーは、このような高水準の例外を作成して
、エンタープライズ Bean 呼び出しが正常に完了できなかったことを示します。
この例外がスローされた場合は、JVM ログを参照して、根底にある原因を判別してください。
エンタープライズ Bean コンテナーは、このような高水準の例外を作成して
、エンタープライズ Bean 呼び出しが正常に完了できなかったことを示します。
この例外がスローされた場合は、ログを参照して、根底にある原因を判別してください。
このエラーは、Bean 内で使用されている接続オブジェクトがクローズされていなかったか、 またはヌルになっていなかった場合に発生することがあります。
[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 です。
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 が発生します。