サーブレット、JavaServer Pages ファイル、スタンドアロン・アプリケーション、または他のクライアントが、
WebSphere Application Server がホストするエンタープライズ Bean、ConnectionPool、
または他の指定オブジェクトにアクセスしようとする際に発生する問題を解決するには、
以下のようにして、まずクライアントからターゲット・サーバーにアクセスできるかどうかを確認する必要があります。
以下のステップを実行してください。
- クライアント・サーバーのコマンド・プロンプトで ping server_name と入力して、
接続を確認します。
- 管理コンソールを使用して、ターゲット・リソースのアプリケーション・サーバー、
および EJB モジュールまたは Web モジュール (該当する場合) が開始済みであることを確認します。
接続性に問題がなく、ターゲット・リソースが実行されている場合にのみ、操作を続行してください。
類似した問題が見つからない場合、
または提供されている情報では問題が解決されない場合は、IBM サポートに連絡してください。
JNDI ルックアップ操作からの NameNotFoundException
NameNotFoundException には、以下の 3 つの原因があります。
- 間違ったルックアップ名
- エンタープライズ Bean、データ・ソース、メッセージング・リソース、またはその他のリソースにアクセスしようとした際に NameNotFoundException が発生した場合は、以下のことを行います。
- NameNotFoundException の原因を判別します。
管理コンソールでターゲット・オブジェクトのプロパティーを参照し、
そのオブジェクトが指定する JNDI 名が、クライアントの使用する JNDI 名と一致しているか確認します。
初期コンテキストを取得したサーバーとは別のサーバー上にあるオブジェクトを検索している場合は、
完全修飾名を使用する必要があります。
- エンタープライズ Bean にアクセスするサーブレットなどの別のサーバー・オブジェクトからアクセスする際、
完全修飾 JNDI 名を指定せずにデフォルト・コンテキストを使用していると、
オブジェクトが異なるサーバーでホストされたときに、NameNotFoundException が発生する場合があります。
- スタンドアロン・クライアントからアクセスする場合は、
アクセスしようとしているオブジェクトが、
初期コンテキストを取得したサーバーとは別のサーバー上にある場合があります。
- 完全修飾 JNDI 名を使用して、問題を修正します。
オブジェクトが単一サーバーの場合、完全修飾 JNDI 名は以下のようになります。
cell/nodes/nodeName/servers/serverName/jndiName
制約事項: このリリースでは、オブジェクトはサポートされていません。
オブジェクトがサーバー・クラスター上にある場合、完全修飾 JNDI 名は以下のようになります。
cell/clusters/clusterName/jndiName
- ルックアップされるオブジェクトがバインドされていない
- ルックアップされるオブジェクトがバインドされていないことによる NameNotFoundException を修正するには、以下のことを行います。
- ルックアップされるオブジェクトがエンタープライズ Bean などのアプリケーション・オブジェクトである場合は、アプリケーションが実行されていることを確認します。
- dumpNameSpace ツールを実行し、ネーム・スペースの内容を表示して、ルックアップされるオブジェクトが予想通りの名前でネーム・スペースにバインドされているか確認します。
- 同じホスト上で実行されている同じ名前の 2 つのサーバーが相互運用に使用されている
- node1 のサーバー上で実行されているアプリケーションが、
node2 の同様の名前のサーバー上にあるオブジェクトへのリモート・オブジェクト参照を使用し、
この両ノードが同じホスト上にインストールされている場合は、次のようなさまざまな障害が発生する可能性があります。
- NameNotFoundException が発生して JNDI ルックアップが失敗します。
- JNDI ルックアップ以外の手段で取得されたオブジェクト参照は、
ほとんどの場合、org.omg.CORBA.OBJECT_NOT_EXIST 例外が発生して失敗します。
- リモート・オブジェクト参照が、ローカル・プロセス内のオブジェクトを正しく解決できません。
これは、このオブジェクトがローカル・プロセス内にも存在するためです。
すなわち、node2 のサーバー・プロセスのリモート・オブジェクトに対する参照は、ローカル・プロセス
(node1 のサーバー・プロセス) の同種のオブジェクトに対して正しく解決しません。
異なるノードおよび異なるホスト上にあるサーバー間のオブジェクト参照の場合は、
サーバー名が固有でなくても例外は発生しません。
この障害を修正するためには、一方または両方のサーバーで、
オブジェクト・リクエスト・ブローカー (ORB) の Java 仮想マシン・カスタム・プロパティー com.ibm.websphere.orb.uniqueServerName を、
true に設定します。
- 管理コンソールで、「サーバー」 > 「アプリケーション・サーバー」
> 「server_name」 > 「Java およびプロセス管理」 > 「プロセス定義」
> 「Java 仮想マシン」 > 「カスタム・プロパティー」 > 「新規」とクリックします。
- 「カスタム・プロパティー」設定ページで、カスタム・プロパティーを次のように定義します。
- 「名前」で com.ibm.websphere.orb.uniqueServerName を指定します。
- 「値」では true を指定します。
- 「OK」をクリックします。
-
コンソールのタスクバーで「保管」をクリックします。
- アプリケーション・サーバーを再始動します。
ノード・エージェントによる同様の障害を回避するには、ノード・エージェントの Java 仮想マシン・
カスタム・プロパティー ORB、com.ibm.websphere.orb.uniqueServerName を true に設定します。
JNDI ルックアップ操作からの CannotInstantiateObjectException
Enterprise Bean、データ・ソース、メッセージング・リソース、またはその他のリソースにアクセスしようとして
この例外が発生する場合は、以下のようなことが原因として考えられます。
- シリアライズされた Java オブジェクトが検索されているが、
そのオブジェクトをデシリアライズするために必要なクラスがランタイム環境にない。
- 参照オブジェクトのルックアップ中に、ルックアップ処理の一部としてそのオブジェクトの処理に使用される関連ファクトリーで問題が発生している。
問題の原因を正確に判別するには、以下のようにします。
- 関連ログで、CannotInstantiateObjectException の直前に発生する例外を探してください。
それが java.lang.NoClassDefFoundError または java.lang.ClassNotFoundException である場合は、
エラー・メッセージで参照したクラスがクラス・ローダー
JVM ログを参照します。
- 根本原因のスタック・トレースを印刷し、ファクトリー・クラスを見つける。
これは、javax.naming.NamingManager.getObjectInstance() によって呼び出されます。
障害の原因は、ファクトリーのインプリメンテーションによって異なり、
ファクトリー・クラスの開発者に連絡しなければならないことがあります。
何らかのネーミング例外が発生したことを示すメッセージ NMSV0610I が、
サーバーのログ・ファイルに記述されている
このエラーは通知専用で、例外が実際の問題に関連している場合に発生します。
たいていの場合は発生しません。
このエラーが発生した場合、
ログ・ファイルにはコンテキストを説明するための隣接項目が含まれているはずです。
- 何も問題がない場合は、このメッセージを無視してください。
発生している問題が、報告される例外に関連していない場合、
およびログ内に隣接するエラー・メッセージが他にない場合も、このメッセージを無視してください。
- 問題が発生している場合は、ログを調べて、原因となっているエラーのメッセージを探してください。
- メッセージ NMSV0610I で提供される情報は、発生したネーミング例外に応答して通知される、他の隣接エラー・メッセージに対する重要なデバッグ・データを提供します。
JNDI コンテキスト操作からの OperationNotSupportedException
この問題には、以下の 2 つの原因が考えられます。
- バインドなどの更新操作は、"java:comp/env" で始まる名前で実行されます。このコンテキストとそのサブコンテキストは、読み取り専用です。
- 非 CORBA オブジェクトのコンテキスト・バインドまたは再バインド操作は、WebSphere Application Server に属さないリモート・ネーム・スペース上で実行されます。
これらの CosNaming ネーム・スペースにバインドできるのは、CORBA オブジェクトのみです。
これらのエラーのうち問題の原因となっているものを判別するには、例外メッセージ全文をチェックしてください。
WSVR0046E: バインドに失敗しました。ejb/jndiName: ejb/jndiName.オリジナルの例外 : org.omg.CosNaming.NamingContextPackage.AlreadyBound
このエラーは、2 つの Enterprise Bean サーバー・アプリケーションが同一サーバー上にインストールされている状態で、バインディング名が競合した場合に発生します。
つまり、2 つのアプリケーションのデプロイメント記述子内の jndiName 値が同じ場合に発生します。
このエラーは、その jndiName 値を使用する 2 つ目のアプリケーションが開始された場合、サーバーの始動中に発生します。
これが問題であることを検証するには、複数の Enterprise Bean アプリケーションで指定された jndiName を検索するために、サーバーで実行中のすべての Enterprise Bean サーバー・アプリケーション用のデプロイメント記述子を調べます。
問題を訂正するには、重複するすべての jndiName 値を変更して、サーバー・プロセス内の
各 Enterprise Bean に異なる名前が付いていることを確認してください。
「新規 InitialContext」操作、または URL 名付きの JNDI コンテキスト操作からの ConfigurationException
初期 JNDI コンテキストを取得しようとすると、
無効な JNDI プロパティー値が InitialContext コンストラクターに渡されるため、構成の例外が発生します。
これには、システム・プロパティーまたは有効なクラス・ローダーで可視の jndi.properties ファイル内に
設定されている JNDI プロパティーが含まれています。
プロバイダー URL の形式が誤っている場合、かなり高い確率でプロパティーが誤りです。
必要な個々の jar ファイルをすべて組み込むように CLASSPATH を設定するなど、
JNDI クライアントをシン・クライアントとして実行している場合、
プロパティー・ファイル com/ibm/websphere/naming/jndiprovider.properties を含む .jar ファイルが CLASSPATH に存在することを確認してください。
URL 形式の名前を持つ JNDI コンテキスト呼び出しから例外が発生する場合は、
現在の JNDI 構成が正しく設定されていない可能性があるため、
必要なファクトリー・クラス名を決定できないか、
またはファクトリーが現在有効なクラス・ローダーに対して不可視の状態になっている可能性があります。
名前が Java: URL の場合、JNDI クライアントは、J2EE クライアントまたはサーバー環境で実行する必要があります。
つまり、クライアントをコンテナー内で実行する必要があります。
例外メッセージをチェックして、原因を検証してください。
例外が InitialContext コンストラクターからスローされる場合は、プロパティー設定または CLASSPATH を訂正してください。
例外が JNDI コンテキスト・メソッドからスローされる場合は、
プロパティー java.naming.factory.url.pkgs に、
名前の URL 方式に必要なファクトリーのパッケージ名が含まれることを確認してください。
Java 方式の URL 名は、コンテナー内で実行されている場合にのみ使用できます。
「新規 InitialContext」操作からの ServiceUnavailableException
この例外は、初期コンテキストを取得するネーム・サーバーと連絡を取ろうとした場合に、何らかの予期しない問題が発生したことを示します。
根本原因を調べるには、ServiceUnavailableException を照会します。詳しくは、根本原因を確認してください。
CommunicationExceptions で説明されている一部の問題では、ServiceUnavailableException が発生する可能性もあります。
この例外は、予期しないエラーによって引き起こされるため、確認できる推定原因がありません。
根本原因の例外の原因が示されていない場合は、
『CommunicationExceptions』にリストされている推定原因を調べてください。
「新規 InitialContext」操作からスローされた CommunicationException
初期 JNDI を取得するために、
プロバイダー URL で特定されるネーム・サーバーに接続することができません。
この問題については、以下のような数多くの原因が考えられます。
- プロバイダー URL 内のホスト名またはポートが誤りである。
- ドメイン・ネーム・サーバーがホスト名を IP アドレスに解決できないか、IP アドレスがその下で実際にサーバーが稼働中の IP アドレスと一致しない。
- クライアントまたはサーバー上のファイアウォールのためにプロバイダー URL で指定されたポートを使用できない。
以下の方法でこの問題を解決します。
- プロバイダー URL、クライアントおよびサーバー・マシン上のネットワーク構成が正しいことを確認する。
- ホスト名がクライアント・マシンによって到達できる IP アドレスに解決できることを確認する。
これは、PING コマンドを使用して実行できます。
- ファイアウォールを実行中の場合は、プロバイダー URL に指定されているポートの使用が許可されていることを確認する。