BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

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

 Previous Next Contents PDF で侮ヲ  

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

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

 


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

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

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

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

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

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

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

 


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

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

キューまたはトピックの選択

JMS キューでは、1 つの宛先に対してメッセージが配信されるポイント ツー ポイント メッセージング モデルを実装します。JMS トピックでは、複数の宛先に対してメッセージが配信されるパブリッシュ/サブスクライブ メッセージ モデルを実装します。

JMS コンシューマまたはプロデューサをバックエンド コンポーネントとして Web サービス オペレーションを実装する前に、以下の事項を決める必要があります。

メッセージの取得と処理

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

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

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

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

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

 


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

JMS メッセージのプロデューサまたはコンシューマを使用して Web サービスを実装するには、次の手順に従います。

  1. JMS の送り先からのメッセージを消費する、または JMS の送り先にメッセージを生成する J2EE コンポーネント (一般的にはメッセージ駆動型 Bean) のコードを記述します。

    詳細については、『WebLogic エンタープライズ JavaBeans プログラマーズ ガイド』を参照してください。

  2. Administration Console を使用して、以下の WebLogic Server の JMS コンポーネントをコンフィグレーションします。

    この手順の詳細については、メッセージスタイル Web サービス用の JMS コンポーネントのコンフィグレーションを参照してください。

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

この節では、既に JMS サーバをコンフィグレーションしていることを前提としています。JMS サーバのコンフィグレーションおよび JMS の一般的な情報については、『管理者ガイド』、および『WebLogic JMS プログラマーズ ガイド』を参照してください。

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

  1. ブラウザで Administration Console を起動します。詳細については、ブラウザで Administration Console を起動するには、次の URL を入力します。を参照してください。

  2. 左ペインで、[サービス] ノードをクリックして展開してから、[JMS] ノードを展開します。

  3. [接続ファクトリ] ノードを右クリックして、ドロップダウン リストから [新しい JMSConnectionFactory のコンフィグレーション] を選択します。

  4. 接続ファクトリの名前を [名前] フィールドに入力します。

  5. 接続ファクトリの JNDI 名を [JNDI 名] フィールドに入力します。

  6. [作成] をクリックします。

  7. [対象] タブをクリックします。

  8. サービスをホストしている WebLogic Server の名前がない場合は [選択済み] リスト ボックスにその名前を移動します。

  9. [適用] をクリックします。

  10. 左ペインで、[JMS] ノードの下の [サーバ] ノードをクリックして展開します。

  11. 対象の JMS サーバのノードをクリックして展開します。

  12. [送り先] ノードを右クリックして、次のいずれかを選択します。

  13. JMS の送り先の名前を [名前] テキスト フィールドに入力します。

  14. 送り先の JNDI 名を [JNDI 名] フィールドに入力します。

  15. [作成] をクリックします。

 


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

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

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

  1. Web サービスのコンポーネントを格納するステージング ディレクトリを作成します。

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

    この手順についての詳細は、『WebLogic Server アプリケーションの開発』を参照してください。

  3. JAR ファイルをステージング ディレクトリにコピーします。

  4. ステージング ディレクトリに、servicegen Ant タスクへの呼び出しを含む Ant ビルド ファイル (デフォルトのファイル名は build.xml) を作成します。

    servicegen Ant タスクを指定する方法の詳細については、servicegen Ant タスクを実行するを参照してください。

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

  5. 環境を設定します。

    Windows NT では、setWLSEnv.cmd コマンドを実行します。WL_HOME¥server¥bin ディレクトリにあります。WL_HOME は WebLogic プラットフォームがインストールされている最上位ディレクトリです。

    UNIX では、setWLSEnv.sh コマンドを実行します。WL_HOME/server/bin ディレクトリにあります。WL_HOME は WebLogic プラットフォームがインストールされている最上位ディレクトリです。

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

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

servicegen Ant タスクを実行する

以下のサンプル build.xml ファイルは、servicegen Ant タスクの実行方法を示しています。

<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>

この例では、servicegen Ant タスクは、jmsSendQueueService という Web サービスを 1 つ作成します。この 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. Web サービスのアセンブルに関する JMS 固有情報についてのこの節の説明を読みます。

  2. 適宜 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 キューに送信する
* メッセージが「中止」されると、このモジュールは終了する
*
* @返す
* @例外を送出する
*/
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 サービスから受信する
* メッセージが「中止」されると、このモジュールは終了する
*
* @返す
* @例外を送出する
*/
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) {}
}
}
}

 

Back to Top Previous Next