付録B jUDDI クライアントの使用

B.1. はじめに

jUDDI クライアントを使って Registry に接続します (使用するプロファイルにより、クライアントは、 ./server/default/deployers/esb.deployer/lib/juddi-client-[version].jar./server/all/deployers/esb.deployer/lib/juddi-client-[version].jar、または ./server/production/deployers/esb.deployer/lib/juddi-client-[version].jar にあります)。

注記

クライアントは、UDDI v3 API を使用するため、どの UDDI v3 準拠のレジストリでも接続できます。ただし、Red Hat は jUDDI v3 Registry のみに対応しています。

B.2. JAX-WS トランスポート

上記の uddi.xml ファイルの設定に基づき、クライアントは JAX-WS を用いて (リモートの) レジストリサーバーとやり取りします。つまり、クライアントは JAX-WS 準拠の Web サービススタック (CXF、Axis2、JBossWS) へアクセスする必要があります。
UDDI クライアントが WSDL ドキュメントを検索できるアドレスに、JAX-WS URL が参照しているか確認します。
<!-- JAX-WS Transport -->
<proxyTransport>org.apache.juddi.v3.client.transport.JAXWSTransport</proxyTransport>
    <custodyTransferUrl>
        http://${serverName}:${serverPort}/juddiv3/services/custody-transfer?wsdl
    </custodyTransferUrl>
    <inquiryUrl>
        http://${serverName}:${serverPort}/juddiv3/services/inquiry?wsdl
    </inquiryUrl>
    <publishUrl>
        http://${serverName}:${serverPort}/juddiv3/services/publish?wsdl
    </publishUrl>
    <securityUrl>
        http://${serverName}:${serverPort}/juddiv3/services/security?wsdl
    </securityUrl>
    <subscriptionUrl>
        http://${serverName}:${serverPort}/juddiv3/services/subscription?wsdl
    </subscriptionUrl>
    <subscriptionListenerUrl>
        http://${serverName}:${serverPort}/juddiv3/services/subscription-listener?wsdl
    </subscriptionListenerUrl>
    <juddiApiUrl>
        http://${serverName}:${serverPort}/juddiv3/services/juddi-api?wsdl
    </juddiApiUrl>

B.3. RMI トランスポート

jUDDI をアプリケーションサーバーにデプロイする場合、 UDDI サービスを remote method invocation (RMI) サービスとして登録できます。登録するには、サーバーの deploy/jbossesb-registry.sar/esb.juddi.xml ファイルを編集します。
これで、デプロイメント時に、RMI ベースの UDDI サービスがグローバルの JNDI 名前空間にバインドされています。
  • juddi (クラス: org.jnp.interfaces.NamingContext)
  • UDDIPublicationService (クラス: org.apache.juddi.rmi.UDDIPublicationService)
  • UDDICustodyTransferService (クラス: org.apache.juddi.rmi.UDDICustodyTransferService)
  • UDDISubscriptionListenerService (クラス: org.apache.juddi.rmi.UDDISubscriptionListenerService)
  • UDDISecurityService (クラス: org.apache.juddi.rmi.UDDISecurityService)
  • UDDISubscriptionService (クラス: org.apache.juddi.rmi.UDDISubscriptionService)
  • UDDIInquiryService (クラス: org.apache.juddi.rmi.UDDIInquiryService)
最後にクライアント側で、uddi.properties ファイルの JAXWS セクションをコメントアウトして、代わりに RMI Transport セクションを使用します。

注記

オプションで、java.naming.* プロパティも設定することができます。この例では、JBoss Application Server にデプロイした jUDDI v3 に接続する設定を指定しました。jndi.properties ファイルに java.naming.* プロパティを設定するか、システムパラメーターを設定することができます。

B.4. InVM トランスポート

In-Virtual Machine (InVM) トランスポートを使用することもできます。InVM はクライアントと同じ仮想マシンで jUDDI サーバーを実行することができます。juddi.war アーカイブにデプロイする場合、サーバーは org.apache.juddi.RegistryServlet クラスにより起動されますが、コンテナー以外で実行している場合は、ご自身で org.apache.juddi.Registry サービスを開始、停止する必要があります。
手動で起動するには、他の呼び出しを行う前に、以下のメソッドを呼び出してください。
Registry.start()
Registry をシャットダウンするには、以下の呼び出しを使います。
Registry.stop()
これを行うことで、Registry が持っているリソースを開放できるようになります。
InVM トランスポートを使うには uddi.properties ファイルの該当セクションをアンコメントして、JAXWSRMI Transport セクションをコメントアウトします。

B.5. 依存性

UDDI クライアントは、uddi-ws-3.0.0.jarcommons-configuration-1.5.jarcommons-collection-3.2.1.jarlog4j-1.2.13.jar に依存しています。
これに加え、お使いの設定によっては以下も必要な場合があります。
  • JDK6 のライブラリ
  • JAXWS クライアントライブラリ (CXF などの JAXWS トランスポートを使用している場合)
  • RMI および JNDI クライアントライブラリ (RMI トランスポートを使用している場合)

B.6. サンプルコード

jUDDI uddi-client モジュールにて UDDI クライアントの使用方法を説明している、サンプルコードがあります。
まず、Registry に呼び出しを行い、認証トークンを取得します (以下のコードは、このモジュールの単体テストから取得)。
public void testAuthToken() {
    try {
        String clazz = ClientConfig.getConfiguration().getString(
            Property.UDDI_PROXY_TRANSPORT,Property.DEFAULT_UDDI_PROXY_TRANSPORT);
        Class<?> transportClass = Loader.loadClass(clazz);
        if (transportClass!=null) {
            Transport transport = (Transport) transportClass.newInstance();
            UDDISecurityPortType securityService = transport.getSecurityService();
            GetAuthToken getAuthToken = new GetAuthToken();
            getAuthToken.setUserID("root");
            getAuthToken.setCred("");
            AuthToken authToken = securityService.getAuthToken(getAuthToken);
            System.out.println(authToken.getAuthInfo());
            Assert.assertNotNull(authToken);
        } else {
            Assert.fail();
        }
    } catch (Exception e) {
        e.printStackTrace();
        Assert.fail();
    } 
}
この場合、パブリッシャー (今回は root) が Registry 内に既存のパブリッシャーで、正しいレスポンスを取得できるように適切な認証情報を提供しているか確認してください。