ヘッダーをスキップ

Oracle Application Server Web Services開発者ガイド
10g(10.1.3.1.0)

B31868-01
目次
目次
索引
索引

戻る 次へ

9 JMS宛先を使用したWebサービスのアセンブル

この章では、JMS宛先をWebサービスとして公開する方法について説明します。JMSエンドポイントWebサービスは、JMS宛先(キューまたはトピック)をWSDLのdocument-literalスタイルの操作として公開します。この操作には、送信モードと受信モードがあります。

JMSエンドポイントWebサービスは、JavaエンドポイントのWebサービスの特殊ケースとみなすことができます。JMSエンドポイントWebサービスでは、JMSエンドポイントがJMSメッセージ・オブジェクトの送受信というWebサービス操作を実行します。


注意

データベースのキューまたはOracle Streamsアドバンスト・キューイング(AQ)をベースにしたWebサービスとJMS宛先をベースにしたWebサービスには、いくつかの相違があります。AQのWebサービスは、データベース内のキューの構成をベースにしています。JMS宛先のWebサービスは、中間層にあるJMSプロバイダの構成をベースにします。JMSキューは、バックエンドのデータソース内にあります。このデータソースには、データベース、ファイル・ベースのシステムまたはその他のデータ・リポジトリなどがあります。

データベース内のキューまたはAQからWebサービスを構成する場合は、「Oracle Streams AQからWebサービスをアセンブルする方法」を参照してください。

JMSをトランスポート・メカニズムとして使用してWebサービスと通信する場合は、『Oracle Application Server Web Servicesアドバンスト開発者ガイド』の「Webサービス・トランスポートとしてのJMSの使用方法」を参照してください。  


JMSエンドポイントWebサービスの概要

OracleAS Web Servicesを使用すると、JMS宛先とメッセージをやりとりするWebサービス・エンドポイントを作成できます。JMS Webサービス・エンドポイントは、特定のJMS宛先または宛先のペアとの間でメッセージを送受信するように構成されています。

JMSエンドポイントWebサービスには、次の操作のいずれかを持たせることができます。

JMSエンドポイントWebサービスを構成して、メッセージID、相関IDおよび返信先JMSメッセージ・プロパティをSOAPヘッダーとして送信できます。この構成により、生成されたWSDLおよびスキーマでメッセージ・プロパティのヘッダーおよびタイプが明示的に宣言され、Webサービス・クライアントがこれらを使用できるようになります。

個々のJMSエンドポイントWebサービスでは、サービス開発者の決定に従ってsend操作のみ、receive操作のみまたは両方の操作をサポートできます。

JMSエンドポイントWebサービスは、JMSメッセージ・タイプとしてjavax.jms.ObjectMessageを使用します。このメッセージは内容として、XMLフラグメントのString表現またはjavax.xml.soap.SOAPElementのインスタンスを保持します。

送信を行うJMSエンドポイントWebサービス用として生成されるWSDLは、Web Service-Interoperability(WS-I)Basic Profile 1.0に準拠しており、相互運用性があります。

たとえば、図9-1に示すMDBベースのJMSエンドポイントWebサービス・アプリケーションは、JMSエンドポイントWebサービスからみると、メッセージのsend操作とreceive操作の両方を処理します。また、この図に示すMDBは、JMSの宛先をリスニングするように構成されています。

図9-1    MDBベースのJMSエンドポイントWebサービス


画像の説明

次の手順は、図9-1に示すMDBベースのJMSエンドポイントWebサービス・アプリケーションの処理内容を示します。

  1. Webサービス・クライアントが、JMSエンドポイントWebサービス上でsend操作を起動するためのSOAPリクエストを送信します。

  2. JMSエンドポイントWebサービスが受信メッセージを処理し、それをJMS宛先であるJMS宛先1にダイレクトします。

  3. EJBコンテナが、JMS宛先1をリスニングするMDBを起動します。

  4. MDBは、メッセージを処理すると、JMS宛先2で新しいメッセージを生成します。メッセージの生成および使用には、1つ以上のMDBが関係する場合があります。たとえば、あるMDBがJMS宛先1をリスニングするのみでなく、JMS宛先2へのメッセージ送信も行う場合があります。

  5. (矢印5および6)Webサービス・クライアントが、SOAPリクエスト送信の結果として、JMSエンドポイントWebサービス上でreceive操作を実行し、メッセージを受信します。JMSエンドポイントWebサービスがJMS宛先からのメッセージを使用し、SOAPレスポンス・メッセージに入れ、送信対象となるそのSOAPレスポンス・メッセージをクライアントに渡します。

JMSエンドポイントWebサービスのアセンブル手順

次の手順では、WebServicesAssemblerを使用してJMSエンドポイントWebサービスをアセンブルする方法について説明します。

  1. jmsAssembleコマンドまたはAntタスクを使用してWebServicesAssemblerを実行し、WebサービスのEARファイルを生成します。

    jmsAssembleコマンドの場合は、JMS send操作に対するコネクションを取得するために使用するJMSコネクション・ファクトリのJNDI名(sendConnectionFactoryLocation)、またはすべてのsend操作JMSメッセージのデフォルトの返信先として使用するJMSコネクション・ファクトリのJNDI名(replyToConnectionFactoryLocation)を指定する必要があります。jmsAssembleコマンドおよびその必須とオプションの引数の詳細は、「jmsAssemble」を参照してください。

    次の例では、jms/ws/mdb/theQueueConnectionFactoryは、JMSのsend操作用にJMSキューへのコネクションを生成するJMSコネクション・ファクトリのJNDI名です。

    • jms/ws/mdb/theQueue: send操作によるSOAPメッセージ・ペイロードの送信先であるJMSキューのJNDI名。

    • jms/ws/mdb/logQueueConnectionFactory: 返信先キュー用に使用されるJMSコネクション・ファクトリのJNDI名。

    • jms/ws/mdb/logQueue: すべてのsendメッセージにデフォルトの返信先として設定されるJMSキューのJNDI名。この例ではlinkReceiveWithReplyTo引数が有効であるため、この返信先は、JMSエンドポイントWebサービスのreceive操作でのメッセージの取得にも使用されます。

    このコマンドによって生成されるJ2EEのEARファイルには、WSDLや生成されるファイルweb.xmlファイルなど、JMSエンドポイントWebサービスの構成情報が含まれます。

    コマンドライン:

    java -jar wsa.jar -jmsAssemble
         -sendConnectionFactoryLocation jms/ws/mdb/theQueueConnectionFactory
         -sendQueueLocation jms/ws/mdb/theQueue
         -replyToConnectionFactoryLocation jms/ws/mdb/logQueueConnectionFactory
         -replyToQueueLocation jms/ws/mdb/logQueue
         -linkReceiveWithReplyTo true
         -targetNamespace http://oracle.j2ee.ws/jms-doc
         -typeNamespace http://oracle.j2ee.ws/jms-doc/types
         -serviceName JmsService
         -appName jms_service
         -context jms_service
         -input ./build/mdb_service.jar
         -uri JmsService
         -output ./dist
    

    Antタスク:

    <oracle:jmsAssemble
             linkReceiveWithReplyTo="true"
             targetNamespace="http://oracle.j2ee.ws/jms-doc"
             typeNamespace="http://oracle.j2ee.ws/jms-doc/types"
             serviceName="JmsService"
             appName="jms_service"
             context="jms_service"
             input="./build/mdb_service.jar"
             uri="JmsService"
             output="./dist"
             sendConnectionFactoryLocation="jms/ws/mdb/theQueueConnectionFactory"
             sendQueueLocation="jms/ws/mdb/theQueue"
             replyToConnectionFactoryLocation="jms/ws/mdb/logQueueConnectionFactory"
             replyToQueueLocation="jms/ws/mdb/logQueue"/>
    

    このコマンドおよびAntタスクの説明:

    • jmsAssemble: JMS宛先(キューまたはトピック)をWebサービスとして公開します。「jmsAssemble」を参照してください。

    • sendConnectionFactoryLocation: JMS send操作のためのコネクションの取得に使用するJMS ConnectionFactoryのJNDI名を指定します。ConnectionFactoryのタイプは、send宛先との整合性が必要とされます。「sendConnectionFactoryLocation」を参照してください。

    • sendQueueLocation: JMS send操作に使用するJMSキューのJNDI名を指定します。デフォルト値はありません。「sendQueueLocation」を参照してください。

    • replyToConnectionFactoryLocation: すべてのsend操作JMSメッセージのデフォルトの返信先として使用するJMSコネクション・ファクトリのJNDI名を指定します。ConnectionFactoryのタイプは、返信先との整合性が必要とされます。「replyToConnectionFactoryLocation」を参照してください。

    • replyToQueueLocation: すべてのsend操作JMSメッセージのデフォルトの返信先として使用するJMSキューのJNDI名を指定します。「replyToQueueLocation」を参照してください。

    • linkReceivedWithReplyTo: receive操作を返信先にリンクするかどうかを決定します。「linkReceiveWithReplyTo」を参照してください。

    • targetNamepace: 生成されるWSDLで使用するターゲット名前空間を指定します。この値は、仕様に準拠しているHTTP URL、準拠していないHTTP URL、またはURIであってもかまいません。「targetNamespace」を参照してください。

    • typeNamespace: 生成されるWSDL内のスキーマ型に使用する型名前空間を指定します。指定した名前は必ず使用され、破棄されません。「typeNamespace」を参照してください。

    • serviceName: サービス名を指定します。「serviceName」を参照してください。

    • appName: アプリケーションの名前を指定します。この名前は、通常contexturiなどの他の引数のベース値として使用されます。「appName」を参照してください。

    • context: Webアプリケーションのルート・コンテキストを指定します。「context」を参照してください。

    • input: WEB-INF/classesにコピーされるクラスを格納するJARまたはディレクトリを指定します。この引数は、WebServicesAssemblerによって使用されるクラスパスに追加されます。「input」を参照してください。

    • uri: Webサービスに使用するURIを指定します。「uri」を参照してください。

    • output: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。

  2. すべてのJMS宛先をデプロイします。

  3. サービスをデプロイし、アプリケーションをバインドします。

    通常の方法でEARファイルをOC4Jの実行中インスタンスにデプロイします。EARファイルのデプロイの詳細は、第19章「Webサービスのパッケージ化およびデプロイ」および『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。次は、デプロイメント・コマンドのサンプルです。

    java -jar <OC4J_HOME>/j2ee/home/admin_client.jar deployer:oc4j:localhost:port 
    <user> <password> 
                -deploy 
                -file dist/jms_service.ear 
                -deploymentName jms_service 
                -bindWebApp default-web-site
    

    次のリストは、このコード例のパラメータの説明です。

    • <oc4jHome>: OC4Jインストールが含まれているディレクトリ。

    • <user>: OC4Jのインスタンスのユーザー名。ユーザー名はインストール時に割り当てられます。

    • <password>: OC4Jのインスタンス用のパスワード。パスワードはインストール時に割り当てられます。

    • default-web-site: アプリケーションのバインド先のWebサイト。通常、これはdefault-web-siteになります。Webサイトを構成するには、<OC4J_HOME>/j2ee/home/configserver.xmlファイルを参照してください。

  4. (オプション)デプロイが成功したことを確認します。

    OracleAS Web Servicesでは、デプロイされたWebサービスごとにWebサービス・テスト・ページが提供されます。Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。

  5. クライアント・サイド・コードを生成します。

    JMSエンドポイントWebサービスのWSDLからクライアント・サイドのプロキシを生成する方法と、その他のWSDLからプロキシを生成する方法は同じです。JMSエンドポイントWebサービスのWSDLは、WS-I Basic Profile 1.0に準拠したWSDLツールで使用できますので、相互運用性があります。たとえば、.NET WSDLツールを使用してC#クライアント・スタブを生成することにより、Oracle JMSエンドポイントWebサービスと通信できます。

    • J2SE環境の場合、genProxyコマンドを使用してWebServicesAssemblerツールを実行し、J2SE Webサービス・クライアントのスタブ(クライアント・プロキシ)を生成します。J2SE環境向けのクライアント・サイド・コードの生成およびアセンブルの詳細は、第15章「J2SE Webサービス・クライアントのアセンブル」を参照してください。

    • J2EE環境の場合、genInterfaceコマンドを使用してWebServicesAssemblerツールを実行し、J2EE Webサービス・クライアント用のマッピング・ファイルおよびサービス・エンドポイント・インタフェースを生成します。クライアント・サイド・コードの生成およびアセンブルの詳細は、第14章「J2EE Webサービス・クライアントのアセンブル」を参照してください。

    たとえば、次のコマンドは、J2SEクライアントで使用可能なスタブを生成します。

    コマンドライン:

    java -jar wsa.jar -genProxy 
                      -output build/src/client/ 
                      -wsdl http://localhost:8888/hello/JmsService?WSDL 
                      -packageName oracle.demo.jms_service
    

    Antタスク:

    <oracle:genProxy  wsdl="http://localhost:8888/hello/JmsService?WSDL"
               output="build/src/client"
               packageName="oracle.demo.jms_service"
    />
    

    このコマンドラインおよびAntタスクの説明:

    • genProxy: J2SE Webサービス・クライアントから使用可能な静的プロキシ・スタブを作成します。「genProxy」を参照してください。

    • output: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。

    • wsdl: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。

    • packageName: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。

    このコマンドは、クライアント・プロキシを生成し、これらをディレクトリbuild/src/clientに格納します。クライアント・アプリケーションはこのスタブを使用して、リモート・サービスでの操作を起動します。genProxyの必須およびオプションの引数の詳細は、「genProxy」を参照してください。

  6. クライアントをコンパイルおよび実行します。

    クライアントをコンパイルする前に、クラスパス上にある適切なJARをリストします。クライアントのクラスパスで使用可能なすべてのJARファイルのリストについては、表A-2「クライアント・サイド・プロキシを使用するクライアントのクラスパス・コンポーネント」を参照してください。個々のJARをリストするかわりに、クライアントのクラスパスにクライアント側のJARとしてwsclient_extended.jarを含めることができます。このJARファイルには、Webサービス・クライアントをコンパイルおよび実行するために必要なすべてのクラスが含まれます。これらのクラスは、表A-2にリストされている各JARファイルに含まれているものです。wsclient_extended.jarおよびクライアントのクラスパスの詳細は、「Webサービス・プロキシのクラスパスの設定」を参照してください。

メッセージ処理と応答メッセージ

JMSエンドポイントWebサービスは、受信したSOAPメッセージを処理し、ペイロード(SOAPメッセージのbody要素)をJMS宛先に格納します。この項では、JMSエンドポイントWebサービスからのJMSメッセージを使用および処理するために、開発者が知る必要のある詳細を説明します。

JMSエンドポイントWebサービスに関連するJMSメッセージの内容には、javax.xml.soap.SOAPElement(これはorg.w3c.dom.Elementのサブクラスでもあります)のインスタンスか、またはXMLペイロードの文字列表現であるjava.lang.Stringのいずれかがなることができます。JMSエンドポイントWebサービスでは、JMS宛先にメッセージを置く前に、特定のJMSメッセージ・ヘッダー値を設定できます。JMSエンドポイントWebサービスのアセンブル時に指定したオプションの構成引数の値に応じて、JMSエンドポイントWebサービスにより次のJMSメッセージ・ヘッダーが設定されます。

JMSType
JMSReplyTo
JMSExpiration
JMSPriority
JMSDeliveryMode

JMSエンドポイントWebサービスは、replyToTopicLocation引数またはreplyToQueueLocation引数で指定された値を、JMSReplyToヘッダーに設定します(これらのいずれかが、そのJMSエンドポイントWebサービスに対して構成済になっている必要があります)。replyToConnectionFactoryLocation引数で指定した値は、メッセージに標準文字列プロパティとして設定されます。プロパティ名はOC4J_REPLY_TO_FACTORY_NAMEです。

例9-1に、onMessage()メソッドがJMSエンドポイントWebサービスのsend操作で生成されたメッセージのreply-to情報を取得することを示すコード部分を示します。

例9-1    送信操作によって生成されたメッセージの返信先情報の取得

...
public void onMessage(Message inMessage) {
    // Do some processing
    ObjectMessage msg = null;
    String  factoryName;
    Destination dest;
    Element  el;
    try {
      // Message should be of type objectMessage
      if (inMessage instanceof ObjectMessage) {
        // retrieve the object
        msg = (ObjectMessage) inMessage;
        el = (Element)msg.getObject();
        System.out.println("MessageBean2::onMessage() => Message received: " );
        ((XMLElement)el).print(System.out);  
        processElement(el);
        factoryName = inMessage.getStringProperty("OC4J_REPLY_TO_FACTORY_NAME");
        dest = inMessage.getJMSReplyTo();
...

制限事項

「JMS宛先を使用したWebサービスのアセンブル」を参照してください。

追加情報

詳細は、次を参照してください。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引