Menu Close

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 でサービスプロバイダーを公開する。

サーバーがシャットダウンされるまでループする。

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