WebLogic Web サービス プログラマーズ ガイド
![]() |
![]() |
![]() |
![]() |
この章では、JMS で実装された WebLogic Web サービスを作成する方法について説明します。
Web サービスのオペレーションは、ステートレス セッション EJB または Java クラスを使用して実装するほか、メッセージ駆動型 Bean などの JMS メッセージのコンシューマまたはプロデューサを使用して実装することもできます。
JMS で実装されたオペレーションには、次に示す 2 つのタイプがあります。
このタイプのオペレーションは、JMS メッセージ コンシューマを使用して実装します。このメッセージ コンシューマは、Web サービス オペレーションを呼び出すクライアントが JMS 送り先にデータを送信した後にメッセージを消費します。
クライアント アプリケーションが 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 と JMS コンシューマまたはプロデューサを使用して実装された WebLogic Web サービスのオペレーションとの関係、およびこれらのタイプの Web サービスを開発する際の設計上の考慮事項について説明します。
使用する JMS の送り先のタイプを決定した後で、JMS の送り先からメッセージを取得して処理する J2EE コンポーネントのタイプを決定する必要があります。一般的に、このタイプはメッセージ駆動型 Bean です。このメッセージ駆動型 Bean では、メッセージ処理のすべての作業を実行するか、部分的またはすべての作業を他の EJB に分配します。メッセージ駆動型 Bean がメッセージの処理を完了したら、Web サービスの実行は完了です。
1 つの Web サービス オペレーションで送信と受信の両方をサポートすることはできないため、クライアント アプリケーションでデータの送信と受信の両方ができるようにするには、Web サービス オペレーションを 2 つ作成する必要があります。送信機能を持つ Web サービス オペレーションは、受信機能を持つオペレーションに関連しています。これは、メッセージを処理したオリジナルのメッセージ駆動型 Bean が、受信機能を持つ Web サービス オペレーションに対応する 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 サービスを作成するには、次の手順に従います。
詳細については、『WebLogic エンタープライズ JavaBeans プログラマーズ ガイド』を参照してください。
この手順の詳細については、「メッセージスタイル Web サービス用の JMS コンポーネントをコンフィグレーションする」を参照してください。
この節では、すでに JMS サーバをコンフィグレーションしていることを前提としています。JMS サーバのコンフィグレーションと概要については、「JMS : コンフィグレーション」および『WebLogic JMS プログラマーズ ガイド』を参照してください。
JMS キューおよび JMS 接続ファクトリをコンフィグレーションするには、次の手順に従います。
servicegen
Ant タスクを使用して、JMS で実装された Web サービスを自動的にアセンブルできます。この Ant タスクは、build.xml
ファイルの属性に基づいて web-services.xml
デプロイメント記述子ファイルを作成し、必要に応じて (シリアライゼーション クラスなどの) 非組み込みデータ型コンポーネントを作成し、必要に応じて Web サービスを呼び出すために使用するクライアント JAR ファイルを作成し、すべてをデプロイ可能な EAR ファイルにパッケージ化します。
servicegen
Ant タスクを使用して Web サービスを自動的にアセンブルするには、次の手順に従います。
この手順の詳細については、『WebLogic Server アプリケーションの開発』を参照してください。
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
はドメインの名前です。
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 ファイルをダウンロードし、ドキュメントを解凍してください。
prompt>
ant
次のサンプル 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 サービスを手動でアセンブルするには、次の手順に従います。
web-services.xml
ファイルのコンポーネント情報を更新します。「コンポーネント情報で web-services.xml ファイルを更新する」を参照してください。以下の節では、Web サービスの手動アセンブルに関する JMS 固有情報について説明します。
JMS メッセージのコンシューマとプロデューサ (メッセージ駆動型 Bean など) を JAR ファイルにパッケージ化します。
Web サービス全体が入った EAR ファイルの作成時に、この JAR ファイルを、EJB JAR ファイルと同じく、最上位レベルのディレクトリに格納します。
Web サービスのオペレーションを実装する JMS バックエンド コンポーネントをリストおよび記述する <web-service>
要素の <components>
子要素を作成します。各バックエンド コンポーネントに、後で、そのコンポーネントが実装するオペレーションを記述するのに使用する name
属性があります。
例については、「JMS コンポーネント Web サービス用の web-services.xml ファイルのサンプル」を参照してください。
JMS で実装された Web サービスに対しては、次のタイプのバックエンド コンポーネントをリストすることができます。
<jms-send-destination>
この要素は、クライアント アプリケーションからのデータの送信先である JMS バックエンド コンポーネントを記述します。このコンポーネントは、送信されたデータを JMS の送り先に配置します。この要素の connection-factory
属性を使用して、WebLogic Server が JMS 接続オブジェクトの作成に使用する JMS 接続ファクトリを指定します。次の例に示すように、<jndi-name>
子要素を使用して、送り先の JNDI 名を指定します。
<components>
<jms-send-destination name="inqueue"
connection-factory="myapp.myqueueCF">
<jndi-name path="myapp.myqueueIN" />
</jms-send-destination>
</components>
<jms-receive-queue>
この要素は、クライアント アプリケーションがデータ (特に JMS キューからのデータ) を受信する JMS バックエンド コンポーネントを記述します。connection-factory
属性を使用して、WebLogic Server が JMS 接続オブジェクトの作成に使用する JMS 接続ファクトリを指定します。次の例に示すように、<jndi-name>
子要素を使用して、キューの JNDI 名を指定します。
<components>
<jms-receive-queue name="outqueue"
connection-factory="myapp.myqueueCF">
<jndi-name path="myapp.myqueueOUT" />
</jms-receive-queue>
</components>
次の、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 バックエンド コンポーネントが示されています。
enqueue
と dequeue
という、対応する 2 つの Web サービス オペレーションは、これらのバックエンド コンポーネントを使用して実装されます。
enqueue
オペレーションは、inqueue
コンポーネントを使用して実装されます。このオペレーションは、非同期一方向オペレーションとして定義されます。つまり、クライアント アプリケーションは、データを JMS の送り先に送信した後、SOAP 応答を (例外さえも) 受信しません。クライアントから送信されたデータは、input_payload
パラメータに格納されます。
dequeue
オペレーションは、outqueue
コンポーネントを使用して実装されます。dequeue
オペレーションは、JMS キューからデータを受信するのにクライアント アプリケーションによって呼び出されるので、同期リクエスト応答として定義されます。応答データは、output_payload
出力パラメータに格納されます。
WebLogic Web サービスをデプロイすることで、リモート クライアントで使用できるようにします。WebLogic Web サービスは標準 J2EE エンタープライズ アプリケーションとしてパッケージ化されているため、Web サービスのデプロイはエンタープライズ アプリケーションのデプロイと同じです。
エンタープライズ アプリケーションのデプロイの詳細については、『WebLogic Server アプリケーションのデプロイメント』を参照してください。
この節では、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-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!");
}
}
}
}
}
次の例は、「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) {}
}
}
}
![]() ![]() |
![]() |
![]() |