Tomcat 5.5.x での組み込み JBoss を使用した JNDI の構成のヘルプ
-
02-07-2019 - |
質問
コードで次の検索を試してみると、次のようになります。
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
return (DataSource) envCtx.lookup("jdbc/mydb");
次の例外が発生します。
java.sql.SQLException: QueryResults: Unable to initialize naming context:
Name java:comp is not bound in this Context at
com.onsitemanager.database.ThreadLocalConnection.getConnection
(ThreadLocalConnection.java:130) at
...
JBoss に続いて組み込み JBoss をインストールしました ウィキの説明. 。そして、「デフォルトですべての WAR をスキャンする」デプロイメントを使用して Tomcat を構成しました。 構成 Wiki ページ.
設定ページを引用すると、
JNDI
接続プーリング、EJB、JPA、トランザクションなどの組み込みJBOSSコンポーネントは、JNDIを広範囲に使用してサービスを公開します。埋め込まれたJBossは、TomcatのJNDIインスタンス化の上に自分自身を重ねることにより、TomcatのJNDI実装をオーバーライドします。これにはいくつかの理由があります。
- これらのサービスをすべてserver.xml内で宣言する必要を避けるため
- Java:WebアプリとEJBの間のComp Namespaceの見た目のない統合を可能にするため。
- TomcatのJNDI実装には、いくつかのJBOSSコンポーネントが機能する能力を妨げるいくつかの重要なバグがあります
- 私たちは、リモートで検索できる EJB やその他のサービスをリモート処理するオプションを提供したいと考えています。
上記の引用によると、java:comp/env でルックアップできるように Tomcat の JNDI 実装をオーバーライドする JBoss ネーミング サービスを設定する方法について何か考えている人はいますか?
参考 - 私の環境 Tomcat 5.5.9、Seam 2.0.2sp、Embedded JBoss (Beta 3)、
注記:データベース接続用の -ds.xml ファイルが正しく設定されており、指示に従ってクラスパス上でアクセスできます。
次の点にも注意してください。私はこの質問を組み込み Jboss フォーラムと Seam ユーザー フォーラムに投稿しました。
解決
応答ツールキットをありがとうございます。はい、java:jdbc/mydb に直接アクセスしてデータソースにアクセスできますが、ENC 経由で接続する既存のコード ベースを使用しています。ここで私が見つけた興味深い情報をいくつか紹介します...
上記のコードは次のように動作します。 JBoss 4.2.2.GA 使用されている JNDI ctx パラメータは次のとおりです。
java.naming.factory.initial = org.jnp.interfaces.namingcontextfactory java.naming.factory.url.pkgs = org.jboss.naming:org.jnp.interfaces:org.jboss.naming:org.jnp.interfaces上記のコードは次のように動作します。 トムキャット 5.5.x 使用されている JNDI ctx パラメータは次のとおりです。
java.naming.factory.initial = org.apache.naming.java.javaurlcontextfactory java.factory.url.pkgs = org.apache.naming上記のコードは次のエラーで失敗します 組み込み JBoss (ベータ 3) Tomcat 5.5.x では上記のエラー メッセージが表示されます。
java.naming.factory.initial = org.apache.naming.java.javaurlcontextfactory javaing.factory.url.pkgs = org.apache.naming上記のコードは、上記のエラーで失敗します。
埋め込み JBoss JNDI 設定で何をする必要があるか考えている人はいますか?
他のヒント
java:comp/env はエンタープライズ ネーミング コンテキスト (ENC) として知られており、グローバルには表示されません。見る ここ 詳細については。データソースが登録されているグローバル JNDI 名を見つける必要があります。
これを行う最も簡単な方法は、JBoss の Web ベースの JMX コンソールに移動し、「JNDIView」(名前は正確にはわかりませんが、現在ホームにあります) MBean を探すことです。この MBean には、JNDI バインドされたすべてのオブジェクトのコンテキスト パスを表示する、呼び出し可能なリスト メソッドが必要です。
Jboss Embedded でも同様の問題が発生しましたが、最終的にファイルでの再生を修正しました。テストデータソース-ds.xml
追加する
<mbean code="org.jboss.naming.NamingAlias" name="jboss.jmx:alias=testDatasource">
<attribute name="FromName">jdbc/Example DataSource</attribute>
<attribute name="ToName">java:/testDatasource</attribute>
</mbean>
問題は、jboss が宣言されたすべてのデータソースに接頭辞 java:/ を追加することでした。それで最終的に、testDatasourceという名前のデータソースができ、jdbc/Example DataSourceへのディレクティブでオーバーライドされました。
うまくいくことを願っています