この章では、関数の実行やサービスの利用のためにJava/JSPアプリケーションからBPELプロセスをコールする方法について説明します。
この章の内容は次のとおりです。
このユースケースでは、Simple Object Access Protocol(SOAP)またはJavaから同期および非同期のBPELプロセスを起動する方法について説明します。BPELプロセスは、社会保障番号を受け取り、信用格付けを返します。ユーザーWebインタフェースはJSPファイルによって提供され、JSPファイルは入力を受け取り、信用格付けを取得するためにBPELプロセスに渡します。
|
関連項目: 次のサンプル・ファイルを参照してください。
|
JavaまたはJSPアプリケーションでは、BPELプロセスをコールして関数を実行したり、サービスを利用できます。BPELプロセスはそれ自体Webサービスであり、WSDLおよびSOAPによってクライアント・インタフェースを定義しサポートします。ただし、Oracle BPEL Process ManagerにデプロイされたBPELプロセスは、Java APIによってクライアントからも利用可能にすることができます。
BPELプロセスはWSDLまたはSOAPインタフェースからWebサービスとして、またはクライアントJavaインタフェースからJavaコンポーネントとして起動できます。アプリケーションはリクエストをBPELプロセスに渡すことができるペイロードの形式にします。BPELプロセスはペイロードを受け取り、アプリケーションがリクエストした情報を含むペイロードとともにレスポンスを返します。
図11-1は、可能性のあるいくつかのプロトコルの1つを使用して、アプリケーションがクライアント・パートナ・リンクによってBPELプロセスと相互作用する方法を示しています。
BPELプロセスは、一般的なJava APIを使用して起動できます。オラクル社が提供するクラスを使用すると、BPELプロセスは、一般的なJava APIを使用してOracle BPEL Process Managerへの接続とXMLメッセージの転送ができます。これらのクラスにより、双方向または単方向の起動操作を実行できます。
この項の内容は次のとおりです。
オラクル社が提供するcom.oracle.bpel.client.Locatorクラスを使用すると、サーバー・クラスタリングおよびその他の本番環境の細目に影響されない、柔軟なクライアント・インタフェースがサポートされます。このクラスは次の操作に使用します。
Oracle BPEL Process Managerへの接続(必要に応じて認証を実行)
Oracle BPEL Serverによって提供されるサービスへのハンドルの取得
たとえば、LocatorクラスはローカルのOracle BPEL Process Managerでデフォルト・ドメインに接続し、そのサーバーにデプロイされたBPELプロセスのリストをフェッチできます。この場合、Locatorクラスはcom.oracle.bpel.client.dispatch.IDeliveryServiceインスタンスへのハンドルを返します。
次のインスタンスは、Oracle BPEL Server上でBPELプロセスを起動または開始できます。
import com.oracle.bpel.client.Locator;
import com.oracle.bpel.client.dispatch.IDeliveryService;
// Connect to domain "default" using password ÒbpelÓ
// null IP address means local server
Locator locator = new Locator("default", "welcome1", null);
IDeliveryService deliveryService = (IDeliveryService)locator.lookupService
(IDeliveryService.SERVICE_NAME );
BPELプロセスを含め、すべてのWebサービスはXMLメッセージを受け取って返すので、Webサービスを使用するすべてのJava APIにはJavaからXMLデータを渡す方法が必要です。Oracle BPEL Process Managerのクライアント・クラスcom.oracle.bpel.client.NormalizedMessageを使用すると、XMLメッセージを動的にアクティブにできます。
たとえば、静的文字列XMLデータからCreditRatingServiceの入力メッセージをアクティブにするには、次のコードを使用できます。
import com.oracle.bpel.client.NormalizedMessage;
String xml =
"<ssn xmlns=¥"http://services.otn.com¥">123456789</ssn>";
NormalizedMessage nm = new NormalizedMessage( );
nm.addPart("payload", xml );
実際には、より動的にNormalizedMessagesをアクティブにします。NormalizedMessageクラスの完全なドキュメントは、次の場所にあるOracle BPEL Process ManagerのJavadocを参照してください。
SOA_Oracle_Home¥bpel¥docs¥apidocs
配信サービスがインスタンス化されると、そのサービスによってNormalizedMessage XMLメッセージでBPELプロセスを開始できます。IDeliveryService.request()メソッドの1つを使用すると、入力メッセージを受け取って結果を同期的に返す双方向Webサービス操作を起動できます。
IDeliveryService.request()メソッドはオーバーロードされます。このメソッドの使用可能バージョンの詳細は、Oracle BPEL Process ManagerのJavadocを参照してください。このバージョンでは、request()メソッドには次のシグネチャがあります。
public NormalizedMessage request(java.lang.String processId,
java.lang.String operationName,
NormalizedMessage message)
throws java.rmi.RemoteException
次のコード例(Oracle BPEL Process Managerのサンプルに付属)は、このAPIを使用してCreditRatingService BPELプロセスを起動する方法を示しています。
<%@page import="java.util.Map" %>
<%@page import="com.oracle.bpel.client.Locator" %>
<%@page import="com.oracle.bpel.client.NormalizedMessage" %>
<%@page import="com.oracle.bpel.client.dispatch.IDeliveryService" %>
<html>
<head>
<title>Invoke CreditRatingService</title>
</head>
<body>
<%
String ssn = request.getParameter("ssn");
if(ssn == null)
ssn = "123-12-1234";
String xml = "<ssn xmlns=¥"http://services.otn.com¥">"
+ ssn + "</ssn>";
Locator locator = new Locator("default","bpel",null);
IDeliveryService deliveryService =
(IDeliveryService)locator.lookupService
(IDeliveryService.SERVICE_NAME );
// construct the normalized message and send to oracle bpel process
manager
NormalizedMessage nm = new NormalizedMessage( );
nm.addPart("payload", xml );
NormalizedMessage res =
deliveryService.request("CreditRatingService", "process", nm);
Map payload = res.getPayload();
out.println( "BPELProcess CreditRatingService executed!<br>" );
out.println( "Credit Rating is " + payload.get("payload") );
%>
|
関連項目: 次のサンプルを参照してください。
|
単方向起動操作は、入力メッセージのみを受け取り、結果は返しません。Java APIを使用した単方向BPEL操作の起動手順は、双方向操作の起動方法とよく似ています。違いは、IDeliveryService.request()ではなくIDeliveryService.post()メソッドを使用する点です。このメソッドはオーバーロードされています。これらのメソッドは、BPELプロセスで単方向操作を開始し、レスポンス(少なくとも同期レスポンス)がないものとしてvoidを返します。
Javadocにはcom.oracle.bpel.client.dispatch.IDeliveryServiceについて次の記述があります。
public void post(java.lang.String processId,
java.lang.String operationName,
NormalizedMessage message)
throws java.rmi.RemoteException
次の例のpost()メソッドは、voidを返す点を除き、前述の双方向の例で示したrequest()メソッドとよく似ています。
<%@page import="com.oracle.bpel.client.Locator" %>
<%@page import="com.oracle.bpel.client.NormalizedMessage" %>
<%@page import="com.oracle.bpel.client.dispatch.IDeliveryService" %>
...
Locator locator = new Locator("default", "bpel", null);
...
NormalizedMessage nm = new NormalizedMessage( );
nm.addPart("payload" , xml );
deliveryService.post("HelloWorld", "initiate", nm);
out.println( "BPELProcess HelloWorld initiated!" );
%>
|
関連項目: 次のサンプルを参照してください。
|
Java APIを使用して非同期BPELプロセスを開始する場合、一般的なJavaクライアントをWebサービスと同じ方法でコールバックすることはできないため、プロセス結果の受取り方法を考慮することが必要になる場合がよくあります。この問題は、次の方法で処理できます。
コードにより、プロセスの進行をユーザーに知らせます。たとえば、LoanFlowPlus BPELデモ・アプリケーション(SOA_Oracle_Home¥bpel¥samples¥demos¥LoanDemoPlus)では、最終的な融資提案を手動で承認するなどのユーザー・タスクを介して、進行をユーザーに通知します。完了すると、電子メール・メッセージやJMSメッセージなど、なんらかの通知をプロセスで送信することも可能です。
非同期BPELプロセスでは、Javaクライアントで結果をポーリングします。この場合、クライアントには、特定のインスタンスのステータス情報をフェッチするハンドルが必要です。post()メソッドは、自動ではそのようなハンドルを返しませんが、クライアントによる対話IDの指定を許可します。このIDは任意の一意識別子であり、クライアントが後で特定のインスタンスを識別してステータス情報を取得する際に使用できます。対話IDの特定のフィールド名とその他のプロパティを確認するには、com.oracle.bpel.client.NormalizedMessageクラスのOracle BPELのJavadocを参照してください。これらのプロパティは、BPELプロセスがJava APIからインスタンス化されたときに設定できます。com.oracle.bpel.client.Locator.lookupInstance(String key)メソッドを使用して、対話IDに基づいて特定のインスタンスを見つけることもできます。
また、サポートされているNormalizedMessageプロパティを使用してコールバック用のWebサービスのアドレスを指定し、Javaから非同期BPELプロセスを開始し、Webサービス・リスナーでSOAP/XMLコールバックを受け取ることも可能です。ご使用の環境で非同期BPELプロセスからステータスまたは結果を受け取る方法の詳細は、Oracleサポート・サービスにお問い合せください。
前の各項で説明したコード例は、Oracle BPEL Process Managerが稼働している同じアプリケーション・サーバー・コンテナで実行されます。ただし、これらのAPIは、リモート・クライアントから実行でき、リモート・アプリケーション・サーバーからRemote Method Invocation(RMI)経由で使用できます。使用するRMIクライアント・コードは、クライアントが稼働しているアプリケーション・サーバーによって異なります。特定のクライアント構成および環境でRMIを介してOracle BPEL Process Manager Java APIを使用する方法については、Oracleサポート・サービスにお問い合せください。
BPELプロセスは、Oracle BPEL Serverにデプロイされた後、Webサービスとして自動的に公開されます。XML/SOAP/WSDLインタフェースによってそのプロセスにアクセスでき、開発者は追加の作業をする必要がありません。標準のWebサービス・インタフェースをサポートするということは、Webサービスをサポートする任意のクライアント・テクノロジからBPELプロセスを起動できるということです。このテクノロジとしては、Microsoft .NET、Sun社のJAX-RPC実装、Apache Axis、Oracle JDeveloper、およびその他多数のWebサービス・ツール・キットなどがあります。また、BPELおよびOracle BPEL Process ManagerがWebサービスを公開できるということも意味します。これらのサービスは、同期、非同期の両方で、ほぼすべてのテクノロジや言語で実装されたアプリケーションおよびサービスから起動できます。
BPELプロセスのWSDLインタフェース定義およびプロトコルとしてSOAPを使用するクライアントを記述することにより、Webサービスにアクセスする標準的な方法で、Webサービス・インタフェースを介してBPELプロセスにアクセスできます。