2012-03-14 12 views
3

私はJBoss AS 7.1.0.CR1bを実行しています。私は私のstandalone.xmlにいくつかのデータソースを定義しています。JavaコードでJBoss AS 7のデータソースプロパティを表示するには?

 <subsystem xmlns="urn:jboss:domain:datasources:1.0"> 
      <datasources> 
       <datasource jndi-name="java:/MyDS" pool-name="MyDS_Pool" enabled="true" use-java-context="true" use-ccm="true"> 
        <connection-url>some-url</connection-url> 
        <driver>the-driver</driver> 
        [etc] 

すべて正常です。

私のコードでここに含まれている情報、具体的にはconnection-urldriverの情報にアクセスしようとしています。私は通常通り、JNDIからデータソースを取得しようとしましたが、これらのプロパティへのアクセスを提供するためには表示されません

// catches removed 
InitialContext context; 
DataSource dataSource = null; 
context = new InitialContext(); 
dataSource = (DataSource) context.lookup(jndi); 

CLIENTINFOとのDatabaseMetaDataこのデータソースからの接続オブジェクトからも「ドンこれらの細かいJBossプロパティも含まれています。

私のコードは、データソースが指定されたコンテナ内で実行されるため、すべてのコードを利用できるようになります。私はIronJacamarインターフェイスorg.jboss.jca.common.api.metadata.ds.DataSourceとその実装クラスを見てきましたが、これらのクラスは必要な情報にアクセス可能なフックを持っているようですが、コンテナ内に既に配置されているこれらのリソースを持つオブジェクトを作成する方法に関する情報は見つかりません(インプリメンテーションのコンストラクターでのみ、すべてのプロパティーを手動で入力する必要があります)。

JBoss AS 7のコマンドラインインターフェイスでは、データソースをディレクトリシステムとしてナビゲートして一覧表示できます。 http://www.paykin.info/java/add-datasource-programaticaly-cli-jboss-7/は、Java Management APIがサブシステムとやりとりすると思うものをどのように使用するかに関する優れた記事を提供しますが、これはターゲットJBossサーバーに接続するように見えます。私のコードはすでに内にある内にあるので、これを行うにはもっと簡単な方法が必要でしょうか?

誰かがお手伝いします。どうもありがとう。

答えて

5

あなたが実際にやっていることは、管理措置です。利用可能な管理APIを使用するのが最善の方法です。ここで

は、単純なスタンドアロンの例である:私は考えることができる

public class Main { 

    public static void main(final String[] args) throws Exception { 
     final List<ModelNode> dataSources = getDataSources(); 
     for (ModelNode dataSource : dataSources) { 
      System.out.printf("Datasource: %s%n", dataSource.asString()); 
     } 
    } 

    public static List<ModelNode> getDataSources() throws IOException { 
     final ModelNode request = new ModelNode(); 
     request.get(ClientConstants.OP).set("read-resource"); 
     request.get("recursive").set(true); 
     request.get(ClientConstants.OP_ADDR).add("subsystem", "datasources"); 
     ModelControllerClient client = null; 
     try { 
      client = ModelControllerClient.Factory.create(InetAddress.getByName("127.0.0.1"), 9999); 
      final ModelNode response = client.execute(new OperationBuilder(request).build()); 
      reportFailure(response); 
      return response.get(ClientConstants.RESULT).get("data-source").asList(); 
     } finally { 
      safeClose(client); 
     } 
    } 

    public static void safeClose(final Closeable closeable) { 
     if (closeable != null) try { 
      closeable.close(); 
     } catch (Exception e) { 
      // no-op 
     } 
    } 


    private static void reportFailure(final ModelNode node) { 
     if (!node.get(ClientConstants.OUTCOME).asString().equals(ClientConstants.SUCCESS)) { 
      final String msg; 
      if (node.hasDefined(ClientConstants.FAILURE_DESCRIPTION)) { 
       if (node.hasDefined(ClientConstants.OP)) { 
        msg = String.format("Operation '%s' at address '%s' failed: %s", node.get(ClientConstants.OP), node.get(ClientConstants.OP_ADDR), node.get(ClientConstants.FAILURE_DESCRIPTION)); 
       } else { 
        msg = String.format("Operation failed: %s", node.get(ClientConstants.FAILURE_DESCRIPTION)); 
       } 
      } else { 
       msg = String.format("Operation failed: %s", node); 
      } 
      throw new RuntimeException(msg); 
     } 
    } 
} 

唯一の他の方法は、サーバの内部に依存しているモジュールを追加することです。それは可能ですが、まず管理APIを使用します。

+0

ありがとう@ JamesR.Perkinsさん、ありがとうございます - それを書き留める時間を取ってくれてありがとう。 'InetAddress.getByName(" 127.0.0.1 ")、9999)を使用してクライアントを作成しなければならないという事実は、サーバーへの何らかの外部呼び出しを含むことを示唆しています。 *その環境で走っている*。明示的な外部呼び出しなしで、サブシステム/データソースのプロパティを取得するために、いくつかのJBossクラスのインスタンスを挿入できることを期待していました。そうでない場合は、私はあなたの提案を確かに使用します。再度、感謝します。 –

+0

@BenKirby AFAIK注射できるものは何もありません。それは本当にクライアントとリモートスタイルの接続が必要な管理操作です。私が何か他のものを見つけるか、何かを考え出すなら、私は答えを編集します。 :-) –

+0

JBoss CLI公開API [https://community.jboss.org/wiki/JBossAS7Command-linePublicAPI](https://community.jboss.org/wiki/JBossAS7Command-linePublicAPI)が見つかりました。必要ないリモート接続ですが、現在推奨しているJBossバージョン(「JBoss AS 7.1.1以降」)にアップグレードすることはできません。だからあなたのソリューションに行ってきました - 再び応答に感謝します。 –

関連する問題