31.3. プレーン Java アプリケーションでのサービスの公開

概要

アプリケーションをプレーンな java アプリケーションとしてデプロイする場合は、アプリケーションの main() メソッドでエンドポイントを公開するロジックを実装する必要があります。Apache CXF は、アプリケーションの main() メソッドを記述する 2 つのオプションを提供します。

  • wsdl2java ツールによって生成された main() メソッドを使用
  • エンドポイントを公開するカスタム main() メソッドを作成します。

サーバーメインラインの生成

コードジェネレーター -server フラグは、ツールがシンプルなサーバーのメインラインを生成するようにします。例31.2「生成されたサーバーメインライン」に示すように、生成されたサーバーメインラインは、指定された WSDL コントラクトの port 要素ごとに 1 つのサービスプロバイダーを公開します。

詳細は、「cxf-codegen-plugin」 を参照してください。

例31.2「生成されたサーバーメインライン」 生成されたサーバーのメインラインを示しています。

例31.2 生成されたサーバーメインライン

package org.apache.hello_world_soap_http;

import javax.xml.ws.Endpoint;

public class GreeterServer {

    protected GreeterServer() throws Exception {
        System.out.println("Starting Server");
        Object implementor = new GreeterImpl();
        String address = "http://localhost:9000/SoapContext/SoapPort";
        Endpoint.publish(address, implementor);
    }

    public static void main(String args[]) throws Exception {
        new GreeterServer();
        System.out.println("Server ready...");

        Thread.sleep(5 * 60 * 1000);
        System.out.println("Server exiting");
        System.exit(0);
    }
}

例31.2「生成されたサーバーメインライン」 のコードは、以下を行います。

サービスの実装オブジェクトのコピーをインスタンス化します。

エンドポイントのコントラクト内の wsdl:port 要素の address の子の内容に基づいて、エンドポイントのアドレスを作成する。

エンドポイントを公開します。

サーバーメインラインの作成

Java の最初の開発モデルを使用した場合、または生成されたサーバーのメインラインを使用したくない場合は、独自に作成できます。サーバーのメインラインを作成するには、次のことを行う必要があります。

  1. 「サービスプロバイダーのインスタンス化」 サービスプロバイダーの javax.xml.ws.Endpoint オブジェクト。
  2. サービスプロバイダーを公開するときに使用する任意のサーバーコンテキストを作成します。
  3. 「サービスプロバイダーの公開」 publish() メソッドのいずれかを使用するサービスプロバイダー。
  4. アプリケーションを終了する準備ができたら、サービスプロバイダーを停止します。

例31.3「カスタムサーバーメインライン」 は、サービスプロバイダーを公開するためのコードを示しています。

例31.3 カスタムサーバーメインライン

package org.apache.hello_world_soap_http;

import javax.xml.ws.Endpoint;

public class GreeterServer
{
  protected GreeterServer() throws Exception
  {
  }

  public static void main(String args[]) throws Exception
  {
    GreeterImpl impl = new GreeterImpl();
    Endpoint endpt.create(impl);
    endpt.publish("http://localhost:9000/SoapContext/SoapPort");

    boolean done = false;
   while(!done)
    {
      ...
    }

   endpt.stop();
    System.exit(0);
  }
}

例31.3「カスタムサーバーメインライン」 のコードは、以下を行います。

サービスの実装オブジェクトのコピーをインスタンス化します。

サービス実装の未公開の Endpoint を作成する。

サービスプロバイダーを http://localhost:9000/SoapContext/SoapPort に公開します。

サーバーをシャットダウンするまでループします。

公開されたエンドポイントを停止します。