ナビゲーションをスキップ

WebLogic Web サービス プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

JMS で実装された WebLogic Web サービスの作成

この章では、JMS で実装された WebLogic Web サービスを作成する方法について説明します。

 


JMS で実装された WebLogic Web サービスの作成方法の概要

Web サービスのオペレーションは、ステートレス セッション EJB または Java クラスを使用して実装するほか、メッセージ駆動型 Bean などの JMS メッセージのコンシューマまたはプロデューサを使用して実装することもできます。

JMS で実装されたオペレーションには、次に示す 2 つのタイプがあります。

クライアント アプリケーションが JMS で実装された Web サービス オペレーションにデータを送信する際、WebLogic Server は、まず、そのデータが組み込みデータ型かどうかによって、組み込みまたはカスタムのシリアライザを使用して XML データをその Java 表現に変換します。WebLogic Server は、変換の結果として取得した Java オブジェクトを javax.jms.ObjectMessage オブジェクトにラップし、JMS の送り先に配置します。次に、メッセージ駆動型 Bean などの JMS リスナを記述して、ObjectMessage を受け取って処理することができます。クライアント アプリケーションが Web サービスを呼び出して JMS キューからデータを受信するときは、これと逆の順序で同様の動作が行われます。

非組み込みデータ型を使用している場合は、web-services.xml デプロイメント記述子ファイルを、正しいデータ型マッピング情報で更新する必要があります。Web サービスが当該データのデータ型マッピング情報を見つけられない場合は、データは、SOAP With Attachments API For Java (SAAJ) 仕様で定義されている javax.xml.soap.SOAPElement データ型に変換されます。

注意 :JMS コンシューマまたはプロデューサで実装された Web サービス オペレーションへの in パラメータと戻り値は、java.io.Serializable インタフェースを実装する必要があります。

メッセージ駆動型 Bean のプログラミングについては、『WebLogic エンタープライズ JavaBeans プログラマーズ ガイド』を参照してください。

 


JMS で実装された WebLogic Web サービスの設計

この節では、JMS と JMS コンシューマまたはプロデューサを使用して実装された WebLogic Web サービスのオペレーションとの関係、およびこれらのタイプの Web サービスを開発する際の設計上の考慮事項について説明します。

メッセージを取得する、処理する

使用する JMS の送り先のタイプを決定した後で、JMS の送り先からメッセージを取得して処理する J2EE コンポーネントのタイプを決定する必要があります。一般的に、このタイプはメッセージ駆動型 Bean です。このメッセージ駆動型 Bean では、メッセージ処理のすべての作業を実行するか、部分的またはすべての作業を他の EJB に分配します。メッセージ駆動型 Bean がメッセージの処理を完了したら、Web サービスの実行は完了です。

1 つの Web サービス オペレーションで送信と受信の両方をサポートすることはできないため、クライアント アプリケーションでデータの送信と受信の両方ができるようにするには、Web サービス オペレーションを 2 つ作成する必要があります。送信機能を持つ Web サービス オペレーションは、受信機能を持つオペレーションに関連しています。これは、メッセージを処理したオリジナルのメッセージ駆動型 Bean が、受信機能を持つ Web サービス オペレーションに対応する JMS の送り先に応答を配置するためです。

JMS コンポーネントの使用例

図 16-1 は、クライアントからメッセージを受信するものと、クライアントへメッセージを送信するものの 2 つの Web サービス オペレーションを示しています。2 つの Web サービス オペレーションには、それぞれ独自の JMS の送り先があります。メッセージ駆動型 Bean は、最初の JMS の送り先からメッセージを取得して情報を処理し、メッセージを 2 番目の JMS の送り先に戻します。クライアントは、最初の Web サービス オペレーションを呼び出してメッセージを WebLogic Server に送信し、次に 2 番目の Web サービス オペレーションを呼び出して WebLogic Server からメッセージを受信します。

図 16-1 JMS 実装の Web サービス オペレーションと JMS 間のデータ フロー

JMS 実装の Web サービス オペレーションと JMS 間のデータ フロー


 

 


JMS で実装された WebLogic Web サービスの作成

JMS メッセージのプロデューサまたはコンシューマで実装される Web サービスを作成するには、次の手順に従います。

  1. JMS の送り先からのメッセージを消費する、または JMS の送り先にメッセージを生成する J2EE コンポーネント (一般的にはメッセージ駆動型 Bean) のコードを記述します。
  2. 詳細については、『WebLogic エンタープライズ JavaBeans プログラマーズ ガイド』を参照してください。

  3. Administration Console を使用して、以下の WebLogic Server の JMS コンポーネントをコンフィグレーションします。
  4. この手順の詳細については、「メッセージスタイル Web サービス用の JMS コンポーネントをコンフィグレーションする」を参照してください。

 


メッセージスタイル Web サービス用の JMS コンポーネントをコンフィグレーションする

この節では、すでに JMS サーバをコンフィグレーションしていることを前提としています。JMS サーバのコンフィグレーションと概要については、「JMS : コンフィグレーション」および『WebLogic JMS プログラマーズ ガイド』を参照してください。

JMS キューおよび JMS 接続ファクトリをコンフィグレーションするには、次の手順に従います。

  1. ブラウザで Administration Console を起動します。詳細については、「WebLogic Web サービスの管理の概要」を参照してください。
  2. 左ペインで、[サービス|JMS] を開きます。
  3. [接続ファクトリ] ノードを右クリックして、ドロップダウン リストから [新しい JMSConnectionFactory のコンフィグレーション] を選択します。
  4. 接続ファクトリの名前を [名前] フィールドに入力します。
  5. 接続ファクトリの JNDI 名を [JNDI 名] フィールドに入力します。
  6. 必要に応じて残りのフィールドに値を入力します。これらのフィールドの詳細については、「JMS : コンフィグレーション」を参照してください。
  7. [作成] をクリックします。
  8. この JMS 接続ファクトリをデプロイするサーバまたはクラスタを選択します。
  9. [適用] をクリックします。
  10. 左ペインで、[サービス|JMS|サーバ] を開きます。
  11. JMS 送り先を作成する JMS サーバを選択します。
  12. [送り先] ノードを右クリックし、ドロップダウン リストから [新しい JMSQueue のコンフィグレーション] を選択してキューを作成します。
  13. JMS の送り先の名前を [名前] テキスト フィールドに入力します。
  14. 送り先の JNDI 名を [JNDI 名] フィールドに入力します。
  15. 必要に応じて残りのフィールドに値を入力します。これらのフィールドの詳細については、「JMS : コンフィグレーション」を参照してください。
  16. [作成] をクリックします。

 


JMS で実装された WebLogic Web サービスの servicegen によるアセンブル

servicegen Ant タスクを使用して、JMS で実装された Web サービスを自動的にアセンブルできます。この Ant タスクは、build.xml ファイルの属性に基づいて web-services.xml デプロイメント記述子ファイルを作成し、必要に応じて (シリアライゼーション クラスなどの) 非組み込みデータ型コンポーネントを作成し、必要に応じて Web サービスを呼び出すために使用するクライアント JAR ファイルを作成し、すべてをデプロイ可能な EAR ファイルにパッケージ化します。

servicegen Ant タスクを使用して Web サービスを自動的にアセンブルするには、次の手順に従います。

  1. Web サービスのコンポーネントを格納するステージング ディレクトリを作成します。
  2. JMS メッセージのコンシューマとプロデューサ (メッセージ駆動型 Bean など) を JAR ファイルにパッケージ化します。
  3. この手順の詳細については、『WebLogic Server アプリケーションの開発』を参照してください。

  4. JAR ファイルをステージング ディレクトリにコピーします。
  5. 環境を設定します。
  6. Windows NT では、ドメイン ディレクトリにある setEnv.cmd コマンドを実行します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME\user_projects\domains\domainName です。BEA_HOME は BEA Products の最上位のインストール ディレクトリで、domainName はドメインの名前です。

    UNIX では、ドメイン ディレクトリにある setEnv.sh コマンドを実行します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME/user_projects/domains/domainName です。BEA_HOME は BEA Products の最上位のインストール ディレクトリで、domainName はドメインの名前です。

  7. ステージング ディレクトリに、servicegen Ant タスクの呼び出しを含む Ant ビルド ファイル (デフォルトのファイル名は build.xml) を作成します。
  8. servicegen Ant タスクを指定する方法の詳細については、コード リスト 16-1 を参照してください。

    Ant ビルド ファイルの一般的な情報については、「http://jakarta.apache.org/ant/manual/」を参照してください。

    注意 :Apache Jakarta Web サイトでは、Ant の最新バージョン向けのオンライン ドキュメントのみが公開されています。公開されているバージョンが WebLogic Server にバンドルされている Ant のバージョンとは異なる場合もあります。 WebLogic Server にバンドルされている Ant のバージョンを判別するには、WebLogic 環境の設定後に次のコマンドを実行します。

    prompt> ant -version 

    特定のバージョンの Ant ドキュメントを参照するには、http://archive.apache.org/dist/ant/binaries/ から Ant zip ファイルをダウンロードし、ドキュメントを解凍してください。

  9. ステージング ディレクトリで ant と入力し、必要であればこのコマンドにターゲットの引数を渡して、build.xml ファイルで指定された Ant タスク (1 つまたは複数) を実行します。
  10. prompt> ant

    Ant タスクによってステージング ディレクトリに Web サービス EAR ファイルが生成されるので、WebLogic Server へのデプロイが可能になります。

次のサンプル build.xml ファイルには、servicegen Ant タスクの呼び出しが記述されています。

コード リスト 16-1build.xml ファイルのサンプル

<project name="buildWebservice" default="ear">
<target name="ear">
<servicegen
destEar="jms_send_queue.ear"
contextURI="WebServices" >
<service
JMSDestination="jms.destination.queue1"
JMSAction="send"
JMSDestinationType="queue"
JMSConnectionFactory="jms.connectionFactory.queue"
JMSOperationName="sendName"
JMSMessageType="types.myType"
generateTypes="True"
targetNamespace="http://tempuri.org"
serviceName="jmsSendQueueService"
serviceURI="/jmsSendQueue"
expandMethods="True">
</service>
</servicegen>
</target>
</project>

build.xml ファイルを使用して servicegen Ant タスクを実行すると、jmsSendQueueService という単一の Web サービスが作成されます。この Web サービスを識別するための URI は /jmsSendQueue です。Web サービスにアクセスするための完全 URL は次のとおりです。

http://host:port/WebServices/jmsSendQueue

servicegen Ant タスクは、jms_send_queue.ear という EAR ファイルに Web サービスをパッケージ化します。EAR ファイルには、web-services.war (デフォルト名) という、web-services.xml デプロイメント記述子ファイルなどの Web サービス コンポーネントがすべて格納された WAR ファイルが含まれています。

Web サービスは、sendName という 1 つのオペレーションをエクスポーズします。この Web サービスのオペレーションを呼び出すクライアント アプリケーションは、JNDI 名が jms.destination.queue1 である JMS キューにメッセージを送信します。このキューとの接続を作成するために使用される JMS ConnectionFactory は jms.connectionFactory.queue です。 sendName オペレーションの 1 つのパラメータのデータ型は types.myType です。generateTypes 属性が True に設定されているので、servicegen Ant タスクはこのデータ型の非組み込みデータ型コンポーネント (シリアライゼーション クラスなど) を生成します。

注意 :types.myType Java クラスは、servicegen の CLASSPATH で設定されている必要があります。設定されていないと、servicegen で適切なコンポーネントを生成できません。

 


JMS で実装された WebLogic Web サービスの手動アセンブル

JMS で実装された WebLogic Web サービスを手動でアセンブルするには、次の手順に従います。

  1. JMS メッセージ コンシューマおよびプロデューサを JAR ファイルにパッケージ化します。「JMS メッセージのコンシューマとプロデューサをパッケージ化する」を参照してください。
  2. web-services.xml ファイルのコンポーネント情報を更新します。「コンポーネント情報で web-services.xml ファイルを更新する」を参照してください。
  3. 適宜 JMS 固有情報を使用しながら、「個別用途の Ant タスクを使用した WebLogic Web サービスのアセンブル」で説明されている手順に従います。

以下の節では、Web サービスの手動アセンブルに関する JMS 固有情報について説明します。

JMS メッセージのコンシューマとプロデューサをパッケージ化する

JMS メッセージのコンシューマとプロデューサ (メッセージ駆動型 Bean など) を JAR ファイルにパッケージ化します。

Web サービス全体が入った EAR ファイルの作成時に、この JAR ファイルを、EJB JAR ファイルと同じく、最上位レベルのディレクトリに格納します。

コンポーネント情報で web-services.xml ファイルを更新する

Web サービスのオペレーションを実装する JMS バックエンド コンポーネントをリストおよび記述する <web-service> 要素の <components> 子要素を作成します。各バックエンド コンポーネントに、後で、そのコンポーネントが実装するオペレーションを記述するのに使用する name 属性があります。

例については、「JMS コンポーネント Web サービス用の web-services.xml ファイルのサンプル」を参照してください。

JMS で実装された Web サービスに対しては、次のタイプのバックエンド コンポーネントをリストすることができます。

JMS コンポーネント Web サービス用の web-services.xml ファイルのサンプル

次の、web-services.xml ファイルのサンプルは、JMS メッセージのコンシューマまたはプロデューサを使用して実装される Web サービスを記述しています。

<web-services>
<web-service targetNamespace="http://example.com"
name="myMessageService" uri="MessageService">
         <components>
<jms-send-destination name="inqueue"
connection-factory="myapp.myqueuecf">
<jndi-name path="myapp.myinputqueue" />
</jms-send-destination>
<jms-receive-queue name="outqueue"
connection-factory="myapp.myqueuecf">
<jndi-name path="myapp.myoutputqueue" />
</jms-receive-queue>
</components>
         <operations xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<operation invocation-style="one-way" name="enqueue"
component="inqueue" />
<params>
<param name="input_payload" style="in" type="xsd:anyType" />
</params>
</operation>
<operation invocation-style="request-response" name="dequeue"
component="outqueue" >
<params>
<return-param name="output_payload" type="xsd:anyType"/>
</params>
</operation>
</operations>
</web-service>
</web-services>

この例では、クライアント アプリケーションが JMS の送り先にデータを送信する inqueue と、クライアント アプリケーションが JMS キューからデータを受信する outqueue という、2 つの JMS バックエンド コンポーネントが示されています。

enqueuedequeue という、対応する 2 つの Web サービス オペレーションは、これらのバックエンド コンポーネントを使用して実装されます。

enqueue オペレーションは、inqueue コンポーネントを使用して実装されます。このオペレーションは、非同期一方向オペレーションとして定義されます。つまり、クライアント アプリケーションは、データを JMS の送り先に送信した後、SOAP 応答を (例外さえも) 受信しません。クライアントから送信されたデータは、input_payload パラメータに格納されます。

dequeue オペレーションは、outqueue コンポーネントを使用して実装されます。dequeue オペレーションは、JMS キューからデータを受信するのにクライアント アプリケーションによって呼び出されるので、同期リクエスト応答として定義されます。応答データは、output_payload 出力パラメータに格納されます。

 


JMS で実装された WebLogic Web サービスのデプロイ

WebLogic Web サービスをデプロイすることで、リモート クライアントで使用できるようにします。WebLogic Web サービスは標準 J2EE エンタープライズ アプリケーションとしてパッケージ化されているため、Web サービスのデプロイはエンタープライズ アプリケーションのデプロイと同じです。

エンタープライズ アプリケーションのデプロイの詳細については、『WebLogic Server アプリケーションのデプロイメント』を参照してください。

 


JMS で実装された WebLogic Web サービスの呼び出し

この節では、JMS で実装された WebLogic Web サービスを呼び出すクライアント アプリケーションのサンプルを 2 つ示します。サービス オペレーションにデータを送信するクライアント アプリケーションと、同じ Web サービス内の他のオペレーションからデータを受信するクライアント アプリケーションのサンプルです。 この Web サービスを記述する、次の web-services.xml ファイルに示すように、第 1 のオペレーションは JMS の送り先を使用して実装されていて、第 2 のオペレーションは JMS キューを使用して実装されています。

<web-services xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
  <web-service
name="BounceService"
targetNamespace="http://www.foobar.com/echo"
uri="/BounceService">
      <components>
         <jms-send-destination name="inqueue"
connection-factory="weblogic.jms.ConnectionFactory">
<jndi-name path="weblogic.jms.inqueue" />
</jms-send-destination>
<jms-receive-queue name="outqueue"
connection-factory="weblogic.jms.ConnectionFactory">
<jndi-name path="weblogic.jms.outqueue" />
</jms-receive-queue>
</components>
   <operations xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<operation invocation-style="one-way" name="submit" component="inqueue" >
</operation>
      <operation invocation-style="request-response" 
name="query" component="outqueue" >
<params>
<return-param name="output_payload" type="xsd:string"/>
</params>
</operation>
</operations>
 </web-service>
</web-services>

非同期 Web サービス オペレーションを呼び出してデータを送信する

次の例は、前節の web-services.xml ファイルで記述されている、submit オペレーションを呼び出す動的クライアント アプリケーションを示しています。submit オペレーションは、クライアント アプリケーションから JMS の送り先 weblogic.jms.inqueue にデータを送信します。このオペレーションは one-way と定義されているので非同期で、呼び出したクライアント アプリケーションにどのような値も返しません。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Service;
import javax.xml.rpc.Call;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;
/**
* @author Copyright (c) 2002 by BEA Systems, Inc. All Rights Reserved.
*/
/**
* send2WS - このモジュールは、特定の Web サービスに接続された JMS キューに送信する
* メッセージが「中止」されると、このモジュールは終了する
*
* @returns
* @throws Exception
*/
public class send2WS{
  public static void main( String[] args ) throws Exception {
  // グローバルな JAX-RPC サービス ファクトリをセットアップする
System.setProperty( "javax.xml.rpc.ServiceFactory",
"weblogic.webservice.core.rpc.ServiceFactoryImpl");
  ServiceFactory factory = ServiceFactory.newInstance();
  // QName を定義
String targetNamespace = "http://www.foobar.com/echo";
  QName serviceName = new QName( targetNamespace, "BounceService" );
QName portName = new QName( targetNamespace, "BounceServicePort" );
  // サービスを作成
Service service = factory.createService( serviceName );
  // 発信呼び出しを作成
Call Ws2JmsCall = service.createCall();
  QName operationName = new QName( targetNamespace, "submit" );
  // ポートとオペレーション名を設定
Ws2JmsCall.setPortTypeName( portName );
Ws2JmsCall.setOperationName( operationName );
  // パラメータを追加
Ws2JmsCall.addParameter( "param",
new QName( "http://www.w3.org/2001/XMLSchema", "string" ), ParameterMode.IN
);
// エンド ポイント アドレスを設定
Ws2JmsCall.setTargetEndpointAddress(
"http://localhost:7001/BounceBean/BounceService" );
  // ユーザからメッセージを取得
BufferedReader msgStream =
new BufferedReader(new InputStreamReader(System.in));
String line = null;
boolean quit = false;
while (!quit) {
System.out.print("Enter message (\"quit\" to quit): ");
line = msgStream.readLine();
if (line != null && line.trim().length() != 0) {
String result = (String)Ws2JmsCall.invoke( new Object[]{ line } );
if(line.equalsIgnoreCase("quit")) {
quit = true;
System.out.print("Done!");
}
}
}
}
}

同期 Web サービス オペレーションを呼び出してデータを送信する

次の例は、「JMS で実装された WebLogic Web サービスの呼び出し」の web-services.xml ファイルで記述されている、query オペレーションを呼び出す動的クライアント アプリケーションを示しています。query オペレーションを呼び出すクライアント アプリケーションは、JMS キュー weblogic.jms.outqueue からデータを受信します。このオペレーションは request-response と定義されているので同期オペレーションで、JMS キューからクライアント アプリケーションにデータを返します。

import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Service;
import javax.xml.rpc.Call;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;
/**
* @author Copyright (c) 2002 by BEA Systems, Inc. All Rights Reserved.
*/
/**
* fromWS - このモジュールは、JMS キューに関連付けられた Web サービスから受信する
* メッセージが「中止」されると、このモジュールは終了する
*
* @returns
* @throws Exception
*/
public class fromWS {
  public static void main( String[] args ) throws Exception {
  boolean quit = false;
// グローバルな JAX-RPC サービス ファクトリをセットアップする
System.setProperty( "javax.xml.rpc.ServiceFactory",
"weblogic.webservice.core.rpc.ServiceFactoryImpl");
  ServiceFactory factory = ServiceFactory.newInstance();
  // QName を定義
String targetNamespace = "http://www.foobar.com/echo";
  QName serviceName = new QName( targetNamespace, "BounceService" );
QName portName = new QName( targetNamespace, "BounceServicePort" );
  // サービスを作成
Service service = factory.createService( serviceName );
  // 発信呼び出しを作成
Call Ws2JmsCall = service.createCall();
  QName operationName = new QName( targetNamespace, "query" );
  // ポートとオペレーション名を設定
Ws2JmsCall.setPortTypeName( portName );
Ws2JmsCall.setOperationName( operationName );
  // パラメータを追加
Ws2JmsCall.addParameter( "output_payload",
new QName( "http://www.w3.org/2001/XMLSchema", "string" ),
ParameterMode.OUT );
// エンドポイント アドレスを設定
Ws2JmsCall.setTargetEndpointAddress(
"http://localhost:7001/BounceBean/BounceService" );
  System.out.println("Setup complete.  Waiting for a message...");
  while (!quit) {
String result = (String)Ws2JmsCall.invoke( new Object[] {} );
if(result != null) {
System.out.println("TextMessage:" + result);
if (result.equalsIgnoreCase("quit")) {
quit = true;
System.out.println("Done!");
}
continue;
}
try {Thread.sleep(2000);} catch (Exception ignore) {}
}
}
}

 

フッタのナビゲーションのスキップ  ページの先頭 前 次