ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-RPC Webサービスの高度な機能のプログラミング
11g リリース1(10.3.6)
B61634-04
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

8 接続プロトコルとしてのJMSトランスポートの使用

この章では、非同期のリクエストとレスポンスを使用するWebLogic Java API for XML-based RPC (JAX-RPC) Webサービスで、JMSトランスポートを接続プロトコルとして使用する方法について説明します。

この章では、以下のトピックについて説明します。

JMSトランスポートの使用の概要

通常、クライアント・アプリケーションからWebLogic Webサービスを呼び出すときは、接続プロトコルとしてHTTP/Sが使用されます。しかし、クライアント・アプリケーションがトランスポートとしてJMSを使用するようにWebLogic Webサービスを構成することもできます。

JMSトランスポートを使用すると、信頼性、スケーラビリティ、サービス品質が向上します。Webサービスの信頼性のあるメッセージングの場合と同様に、メソッド呼出しがまだキューに入っているときにWebLogic Serverが停止しても、再起動すればすぐに処理が行われます。クライアントは、Webサービスを呼び出す際に呼出しからのレスポンスを待機しないため、クライアントの実行は続行可能です。ただし、JMSトランスポートを使用する場合は、HTTP/Sより若干オーバーヘッドが大きくなり、プログラムが複雑になります。

トランスポートを構成するには、後の項で説明するように、JWSアノテーションとjwsc Antタスクの子要素のどちらかを使用します。接続トランスポートとしてJMSを使用するようにWebLogic Webサービスを構成した場合、Webサービスの生成済WSDLで対応するポートに対して指定されたエンドポイント・アドレスのURLでは、http://ではなくjms://が使用されます。JMSエンドポイントのアドレスの例を次に示します。

jms://myHost:7001/transports/JMSTransport?URI=JMSTransportQueue

URLのURI=JMSTransportQueueセクションでは、JMSトランスポート機能用に構成されたJMSキューを指定しています。HTTPを使用してWebサービスを呼び出すことはできませんが、HTTPを使用してそのWebサービスのWSDLを参照できます。これにより、clientgenはやはりWebサービスのJAX-RPCスタブを生成できます。

指定する各トランスポートに対し、WebLogic ServerはWSDL内に追加のポートを生成します。このため、Webサービス呼出し時に使用できるトランスポート(JMS、HTTP、またはHTTPS)をクライアント・アプリケーションで選択できるようにするには、適切なJWSアノテーションまたはjwscの子要素を使用して、明示的にトランスポートを追加する必要があります。


注意:

JMSトランスポートの使用は、WebLogicの付加価値機能です。.NETクライアントなど、WebLogic以外のクライアント・アプリケーションでは、JMSポートを使用してWebサービスを呼び出すことができない場合があります。

Javaから開始するJMSトランスポートの使用:主な手順

Javaから開始する際にJMSトランスポートを使用するには、以下の少なくとも1つのタスクを実行する必要があります。

次の手順では、Javaから開始する際に、JMSトランスポートを使用して現在のWebサービスを呼び出すために必要なすべての手順について説明します。


注意:

Webサービスを実装する基本的なJWSファイルが作成されており、JMSを使用して呼び出すWebサービスを構成することが前提となっています。また、Antベースの開発環境を設定済であり、かつjwsc Antタスクを実行してサービスをデプロイするためのターゲットを含む、作業用のbuild.xmlファイルがあることも前提となっています。詳細は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』を参照してください。

表8-1 Javaから開始するJMSトランスポートの使用手順

#
手順 説明

1

必要なJMSコンポーネント用にWebLogic Serverドメインを構成します。

「JMSトランスポートWebサービスのホストWebLogic Serverインスタンスの構成」を参照してください。

2

JWSファイルに@WLJmsTransportアノテーションを追加します。(オプション)。

この手順は省略可能です。現在のJWSに@WLJmsTransportアノテーションを追加しない場合、<WLJmsTransport>子要素をjwsc Antタスクに追加する必要があります(ステップ3を参照)。

「@WLJmsTransport JWSアノテーションの使用」を参照してください。

3

jwsc Antタスクに<WLJmsTransport>子要素を追加します。(オプション)。

<WLJmsTransport>子要素を使用して、JWSファイルで定義されているトランスポートをオーバーライドします。この手順は、ステップ2で@WLJmsTransportアノテーションをJWSファイルに追加しなかった場合に必須です。それ以外の場合、この手順は省略可能です。

詳細については、「jwsc Antタスクの<WLJmsTransport>子要素の使用」を参照してください。

4

jwscタスクを呼び出すbuild.xml Antファイル内のターゲットを実行することにより、Webサービスをビルドします。

たとえば、jwsc Antタスクを呼び出すターゲットがbuild-serviceというものであれば、以下を実行します。

prompt> ant build-service

『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のjwsc WebLogic WebサービスAntタスクの実行に関する項を参照してください。

5

WebサービスをWebLogic Serverにデプロイします。

『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。


JMSトランスポートを使用してWebサービスを呼び出すようにクライアント・アプリケーションを更新する方法については、「JMSトランスポートを使用したWebLogic Webサービスの呼出し」を参照してください。

WSDLから開始するJMSトランスポートの使用:主な手順

WSDLから開始する際にJMSトランスポートを使用するには、以下の少なくとも1つのタスクを実行する必要があります。

次の手順では、WSDLから開始する際に、JMSトランスポートを使用して現在のWebサービスを呼び出すために必要なすべての手順について説明します。


注意:

この手順では既存のWSDLファイルがあることを前提としています。

表8-2 WSDLから開始するJMSトランスポートの使用手順

#
手順 説明

1

必要なJMSコンポーネント用にWebLogic Serverドメインを構成します。

「JMSトランスポートWebサービスのホストWebLogic Serverインスタンスの構成」を参照してください。

2

JMSトランスポートを使用するようWSDLを更新する(オプション)。

この手順は省略可能です。JMSトランスポートを使用するようWSDLを更新しなかった場合、以下の少なくとも1つの作業を行う必要があります。

  • 途中まで作成済みのJWSファイルを編集して@WLJmsTransportアノテーションをJWSファイルに追加します(ステップ4を参照)。

  • <WLJmsTransport>子要素をjwsc Antタスクに追加します(ステップ5を参照)。

「JMSトランスポートを使用するためのWSDLの更新」を参照してください。

3

WSDLファイルに対してwsdlc Antタスクを実行します。

たとえば、wsdlc Antタスクを呼び出すターゲットがgenerate-from-wsdlというものであれば、以下を実行します。

prompt> ant generate-from-wsdl

『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のwsdlc WebLogic WebサービスAntタスクの実行に関する項を参照してください。

4

途中まで作成済みのJWSファイルを更新します。

wsdlc Antタスクにより途中まで作成済のJWSファイルが生成されます。必要な動作をWebサービスに実装するには、独自のビジネス・コードをWebサービスに追加する必要があります。『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のwsdlcで生成される途中まで作成済のJWS実装クラス・ファイルの更新に関する項を参照してください。

ステップ2で、JMSトランスポートを使用するようにWSDLを更新した場合、JWSファイルには、JMSトランスポートを定義する@WLJmsTransportアノテーションが含まれます。@WLJmsTransportアノテーションがJWSファイルに含まれない場合、以下の少なくとも1つの作業を行う必要があります。

5

jwsc Antタスクに<WLJmsTransport>子要素を追加します。(オプション)。

<WLJmsTransport>子要素を使用して、JWSファイルで定義されているトランスポートをオーバーライドします。JWSファイルに@WLJmsTransportアノテーションが含まれない場合、この手順は必須です(ステップ4を参照)。それ以外の場合、この手順は省略可能です。

詳細については、「jwsc Antタスクの<WLJmsTransport>子要素の使用」を参照してください。

6

JWSファイルに対してjwsc Antタスクを実行し、Webサービスをビルドします。

wsdlc Antタスクによって生成されたアーティファクトと更新したJWS実装ファイルを指定して、Webサービスを実装するエンタープライズ・アプリケーションを生成します。『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のjwsc WebLogic WebサービスAntタスクの実行に関する項を参照してください。

7

WebサービスをWebLogic Serverにデプロイします。

『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。


JMSトランスポートを使用してWebサービスを呼び出すようにクライアント・アプリケーションを更新する方法については、「JMSトランスポートを使用したWebLogic Webサービスの呼出し」を参照してください。

JMSトランスポートWebサービスのホストWebLogic Serverインスタンスの構成

JMSトランスポートWebサービスのデプロイ先となるWebLogic Serverインスタンスを構成する際には、Webサービスのランタイムで内部的に使用される、JMSサーバーやモジュールなどのJMSリソースを構成します。

これらのリソースは手作業でも構成できますが、構成ウィザードで、Webサービス固有の拡張テンプレートを使用してWebLogic Serverドメインを拡張することもできます。構成ウィザードを使用すると、必要な構成手順を大幅に簡略化できます。詳細は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebサービス機能用のドメイン構成に関する項を参照してください。


注意:

または、WLSTを使用してリソースを構成することもできます。WLSTを使用してドメインを拡張する方法については、『Oracle WebLogic Scripting Tool』の既存ドメインの構成に関する項を参照してください。

Webサービス・リソースを含まないドメインは、Webサービスと関連のないシナリオや、非同期のリクエストおよびレスポンスを呼び出さないWebサービスのシナリオであれば、適切に起動して実行されます。ただし、サーバー・ログには、非同期リソースが構成されていないことと、Webサービス用の非同期レスポンス・サービスが完全にデプロイされていないことを示すINFOメッセージが表示されます。


リソースを手作業で構成する場合、以下の手順を実行します。

表8-3 JMSトランスポートWebサービスのホストWebLogic Serverインスタンスを手作業で構成する手順

#
手順 説明

1

ホストWebLogic Serverインスタンスが格納されたドメインの管理コンソールを起動します。

ブラウザで管理コンソールを起動するには、次のURLを入力します。

http://host:port/console

説明:

  • hostは、管理サーバーが動作しているコンピュータを指します。

  • portは、管理サーバーが接続リクエストをリスニングしているポート番号を指します。管理サーバーのデフォルトのポート番号は7001です。

『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』の管理コンソールの起動に関する項を参照してください。

3

JMSサーバーを作成します。

JMSサーバーを作成します。JMSサーバーがすでに存在する場合は、新しいJMSサーバーを作成せずにそれを使用できます。

Oracle WebLogic Server管理コンソール・ヘルプJMSサーバーの作成に関する項を参照してください。

4

JMSモジュールを作成し、キューを定義します。

JMSモジュールを作成し、その中にJMSキューを定義します。JMSモジュールがすでに存在する場合は、新しいJMSモジュールを作成せずにそれを使用することもできます。JMSキューを、1つ前の手順で作成したJMSサーバーにターゲット指定します。このJMSキューがローカルであることを必ず指定してください(通常は、ローカルJNDI名の設定により指定できます)。Oracle WebLogic Server管理コンソール・ヘルプJMSシステム・モジュールの作成に関する項とシステム・モジュールのキューの作成に関する項を参照してください。

JMSトランスポートWebサービスで、デフォルトWebサービスのキューを使用する場合は、JMSキューのJNDI名をweblogic.wsee.DefaultQueueに設定します。そうではなく、別のJNDI名を使用する場合は、@WLJmsTransportアノテーションまたはjwsc Antタスクの子要素<WLJmsTransport>を指定する際にキュー名を指定する必要があります。

クラスタリングの考慮事項:

クラスタ内でWebサービスのJMSトランスポート機能を使用する場合は、次の作業を行う必要があります。

  • JMSキューの作成時に、分散キューではなくローカル JMSキューを作成します。

  • このJMSキューをクラスタ内の各サーバーに明示的にターゲット指定します。


@WLJmsTransport JWSアノテーションの使用

JWSファイルをプログラムした時点で、Webサービスの呼出しにクライアント・アプリケーションで(HTTP/Sではなく) JMSトランスポートを使用することが決まっている場合は、@WLJmsTransportを使用してその呼出しの詳細を指定できます。後のビルド時に、「jwsc Antタスクの<WLJmsTransport>子要素の使用」に従い、jwsc Antタスクの<WLJmsTransport>子要素を指定して、JWSファイルで定義されている呼出しをオーバーライドし、さらにJMSトランスポート指定を追加できます。

@WLJmsTransportアノテーションを使用する際は、以下のガイドラインに従ってください。

次の例では、@WLJmsTransportアノテーションを使用する簡単なJWSファイルを示します。関連するコードは太字で示しています。

package examples.webservices.jmstransport;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

import weblogic.jws.WLJmsTransport; 

@WebService(name="JMSTransportPortType",
             serviceName="JMSTransportService",
            targetNamespace="http://example.org")

@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,
             use=SOAPBinding.Use.LITERAL,
             parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)

// WebLogic-specific JWS annotation that specifies the context path and
// service URI used to build the URI of the Web Service is
// "transports/JMSTransport"

@WLJmsTransport(contextPath="transports", serviceUri="JMSTransport", 
                queue="JMSTransportQueue", portName="JMSTransportServicePort", 
             connectionFactory="JMSTransportConnectionFactory") 

/**
 * This JWS file forms the basis of simple Java-class implemented WebLogic
 * Web Service with a single operation: sayHello
 */

public class JMSTransportImpl {

  @WebMethod()
  public String sayHello(String message) {
    System.out.println("sayHello:" + message);
    return "Here is the message: '" + message + "'";
  }
}

jwsc Antタスクの<WLJmsTransport>子要素の使用

JMSトランスポートはjwsc Antタスクの<jws>要素の<WLJmsTransport>子要素を使用して、ビルド時にも指定できます。ビルド時にトランスポートを指定する理由としては、次のようなものが挙げられます。

jwsc Antタスクに対してトランスポートを指定すると、それがJWSファイル内のすべてのトランスポート・アノテーションに優先されます。

次の例では、jwsc Antタスクに対してトランスポートを指定する方法を示します。

  <target name="build-service">

    <jwsc
      srcdir="src"
      destdir="${ear-dir}">
      <jws file="examples/webservices/jmstransport/JMSTransportImpl.java">

        <WLJmsTransport
                contextPath="transports" 
                serviceUri="JMSTransport"
                portName="JMSTransportServicePort"
               queue="JMSTransportQueue"
                connectionFactory="JMSTransportConnectionFactory"/>

      </jws>

    </jwsc>

  </target>

上述の例では、「@WLJmsTransport JWSアノテーションの使用」に示したJWSファイルで指定されたものと同じ値をURLおよびJMSキューに対して指定する方法を示しています。

jwsc Antタスクの使用方法の詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のjwscに関する項を参照してください。

JMSトランスポートを使用するためのWSDLの更新

JMSトランスポートを使用するようにWSDLを更新するには、JMSトランスポート情報を定義する<wsdl:binding>定義と<wsdl:service>定義を追加する必要があります。これらの定義は、以下のいずれかの方法で追加できます。

どちらの場合でも、JMSトランスポートを使用するように<wsdl:binding>および<wsdl:service>定義を以下のように変更する必要があります。

JMSトランスポートを使用したWebLogic Webサービスの呼出し

JMSトランスポートを使用してWebサービスを呼び出すクライアント・アプリケーションの記述は、HTTPトランスポートを使用する場合の記述と同様に行います。ただ1つ異なるのは、必ず、JMSキュー(@WLJmsTransportアノテーションまたはjwsc Antタスクの<WLJmsTransport>子要素で指定)とその他のJMSオブジェクトが作成済でなければならないという点です。詳細については、「Javaから開始するJMSトランスポートの使用:主な手順」または「WSDLから開始するJMSトランスポートの使用:主な手順」を参照してください。

HTTPを使用してJMSトランスポートで構成されたWebサービスを呼び出すことはできませんが、HTTPを使用してそのWebサービスのWSDLを参照することはできます。これにより、clientgen AntタスクはWebサービスのJAX-RPCスタブを作成することができます。たとえば、この項で示すWebサービスのWSDLのためのURLは、次のようになります。

http://host:port/transports/JMSTransport?WSDL

ただし、デプロイされたWebサービスのWSDLにおけるエンドポイント・アドレスでは、http://ではなくjms://が使用され、このアドレスには修飾子?URI=JMS_QUEUEが含まれるため、clientgen AntタスクはWebサービス呼出し時にJMSトランスポートを使用するために必要なスタブを自動作成し、クライアント・アプリケーション側で通常と違う処理を行う必要はありません。JMSエンドポイントのアドレスの例を次に示します。

jms://host:port/transports/JMSTransport?URI=JMSTransportQueue

注意:

JMSトランスポートを使用して呼び出すWebサービスをトランザクションのコンテキスト内でも実行することを指定した(つまり、JWSファイルに@weblogic.jws.Transactionalアノテーションが含まれている)場合は、そのサービスを呼び出す際に非同期のリクエストとレスポンスを使用する必要があります。そうしないと、デッドロックが発生して呼出しが失敗します。

Webサービス呼出しに関する一般情報は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebサービスの呼出しに関する項を参照してください。

デフォルトのサービス・アドレスURLのオーバーライド

clientgenで生成されたJAX-RPCスタブを使用してWebサービスを呼び出すクライアント・アプリケーションを作成する場合、Webサービスのデフォルトのサービス・アドレスURLは、ServiceコンストラクタのWSDLファイル引数の<address>要素で指定したものとなります。

ただし、場合によっては、特にクラスタにデプロイされているWebLogic Webサービスを呼び出す際に、クラスタのアドレスまたはクラスタ内の管理対象サーバーのアドレスのリストを指定する場合には、このアドレスをオーバーライドする必要があることがあります。また、t3プロトコルを使用してWebサービスを呼び出すことが必要な場合もあります。JMSトランスポートの使用時にこのサービス・エンドポイントURLをオーバーライドするには、次の例で示すように、weblogic.wsee.jaxrpc.WLStub.JMS_TRANSPORT_JNDI_URLスタブ・プロパティを使用します。

package examples.webservices.jmstransport.client;

import weblogic.wsee.jaxrpc.WLStub; 

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;
import javax.xml.rpc.Stub;

/**
 * This is a simple standalone client application that invokes the
 * the <code>sayHello</code> operation of the JMSTransport Web service.
 */

public class Main {

  public static void main(String[] args)
      throws ServiceException, RemoteException{

    JMSTransportService service = new JMSTransportService_Impl(args[0] + "?WSDL" );
    JMSTransportPortType port = service.getJMSTransportServicePort();

    Stub stub = (Stub) port; 

    stub._setProperty(WLStub.JMS_TRANSPORT_JNDI_URL, 
                      "t3://shackell01.amer.com:7001"); 
    try {
      String result = null;

      result = port.sayHello("Hi there! ");

      System.out.println( "Got JMS result: " + result );

    } catch (RemoteException e) {
      throw e;
    }
  }
}

その他のスタブ・プロパティについては、Oracle WebLogic Server APIリファレンスWLStubに関する項を参照してください。

デフォルトのTextMessageのかわりとしてのJMS BytesMessageの使用

JMSトランスポートを使用する場合、Webサービス・ランタイムは、デフォルトではjavax.jms.TextMessageオブジェクトを使用してメッセージを送信します。ほとんどのクライアント・アプリケーションはこのデフォルトのままで十分ですが、状況によっては普通のテキストではなくバイナリ・データを送信する必要がある場合もあります。その場合は、Webサービス・ランタイムでjavax.jms.BytesMessageを使用することをリクエストする必要があります。そのためには、クライアント・アプリケーションでWLStub.JMS_TRANSPORT_MESSAGE_TYPEスタブ・プロパティを使用し、値としてWLStub.JMS_BYTESMESSAGEを設定します。次に例を示します。

    stub._setProperty(WLStub.JMS_TRANSPORT_MESSAGE_TYPE,
                      WLStub.JMS_BYTESMESSAGE);

Webサービス・ランタイムは、リクエストと同じメッセージ・データ型を使用してレスポンスを戻します。

このプロパティを設定できるクライアント・アプリケーションの例については、「デフォルトのサービス・アドレスURLのオーバーライド」を参照してください。その他のスタブ・プロパティについては、Oracle WebLogic Server APIリファレンスWLStubに関する項を参照してください。

WSDLファイルへのHTTPアクセスの無効化

「JMSトランスポートを使用したWebLogic Webサービスの呼出し」で説明したように、デプロイされているWebサービスのWSDLには、デフォルトでHTTPでアクセスできるようになっています。WSDLファイルへのアクセスを無効にする場合(特に、ファイアウォールの外でWebサービスにアクセスできる場合)は、次のいずれかを実行します。

  • JWSファイルで、weblogic.jws.WSDLアノテーションを使用してプログラム的にアクセスを無効にします。詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のweblogic.jws.WSDLに関する項を参照してください。

  • Webサービスをデプロイした後に、管理コンソールを使用してWSDLへのアクセスを無効にします。この場合、構成情報は、アノテーションではなくデプロイメント・プラン内に格納されます。

    このタスクを管理コンソールを使用して実行する場合は、デプロイしたWebサービスの「構成」→「全般」ページに移動し、「動的WSDLの表示を有効化」チェック・ボックスの選択を解除します。この変更を有効にするには、構成をデプロイメント・プランに保存した後に、Webサービス(またはそのエンタープライズ・アプリケーション)を再デプロイ(更新)する必要があります。