レベル: 中級 Ilya Platonov (ill@isg.axmor.com), Software Engineer and Developer, Axmor Artem Papkov (artem@us.ibm.com), Solution architect, IBM Jim Smith (jamessmi@us.ibm.com), Manager, IBM
2008年 3月 25日 BPEL V2.0 は、BPEL 以外の大量のコンポーネントや Web サービスから構成される巨大で複雑なアプリケーションの開発を補助する、強力な言語です。BPEL を利用すると、グラフィカル・エディターを使って人間が理解しやすい図でワークフローを表現し、長期にわたり実行されるワークフローを記述することができます。この記事では、プロセスを開発するための Eclipse BPEL プラグインと、プロセスを実行するための Apache ODE を組み合わせる方法について説明します。
 |
WS-BPEL とは何か
WS-BPEL は OASIS によって開発された、ベンダーに依存しない仕様であり、ビジネス・プロセスをさまざまな Web サービス間における一連の対話動作として規定します。OASIS は WS-BPEL を次のように定義しています。「ビジネス・プロセスは 2 つの方法で記述することができます。実行可能なビジネス・プロセスは、ビジネスにおける対話動作への参加者の実際の振る舞いをモデル化します。抽象ビジネス・プロセスは、部分的に規定されるプロセスで、実行されることは想定されていません。抽象プロセスは、必要とされる具体的な操作の詳細を隠すことができ、観察可能な振る舞いやプロセス・テンプレートを含む複数のユース・ケースによって動作を記述する役割を果たします。WS-BPEL は、実行可能プロセスと抽象プロセスの両方の振る舞いをモデリングするために使われることを想定しています。
「WS-BPEL は、実行可能なビジネス・プロセスと抽象ビジネス・プロセスを規定するための言語を提供します。そうした言語を提供することによって、WS-BPEL は Web サービスの対話モデルを拡張し、この対話モデルがビジネス・トランザクションをサポートできるようにします。WS-BPEL は、企業内および B2B 双方の領域において自動プロセス統合の拡張を容易にする、相互運用可能な統合モデルを定義します。」
|
|
Apache Foundation では、Apache Foundation による WS-BPEL (Web Services Business Process Execution Language) V2.0 の実装を ODE (Orchestration Director Engine) と呼んでいます。ODE は、Web サービスとの通信やメッセージの送受信などを行える WS-BPEL プロセスを実行します。Eclipse の BPEL プロジェクトは関連のオープンソース・プロジェクトとして、WS-BPEL V2.0 プロセスのビジュアル開発をするための Eclipse プラグインを提供しています。(WS-BPEL 技術が初めての人は「WS-BPEL とは何か」を参照してください。)
この記事の執筆時点では、ODE V1.1 と Eclipse BPEL プロジェクトのマイルストーン M3 が最新バージョンでした。この記事ではこれらの製品を検証し、Apache の ODE と Eclipse の BPEL プロジェクトを使って独自の BPEL プロセスを作成するための方法と、そのプロセスをアプリケーションの中に統合する方法について説明します。
BPMN には慣れていて、Eclipse STP BPMN Modeler を使ってビジネス・プロセスを操作する方法についてのチュートリアルが必要な人は、developerWorks の記事「Execute business processes with Eclipse」(Tyler Anderson 著、「参考文献」を参照) を読むとよいかもしれません。
ソフトウェアのインストール
オペレーティング・システムは、Microsoft® Windows®、Linux®、あるいは Mac OS X のいずれかの最近のバージョンである必要があります。この記事では Linux を使った例が示されているので、お使いのオペレーティング・システムに応じてファイルの場所を読み替える必要があります。ODE と Eclipse の BPEL をインストールする前に、以下のものがコンピューターにインストールされていることを確認します。
- Java™ V5.0 またはそれ以降
- Tomcat V5.5 またはそれ以降
- 次のプラグインをインストールした Eclipse V3.3.x
- EMF V2.3.x
- GEF V3.3.x
- DTP STK V1.5.x
- WTP (Web Tools Platform) V2.0.x
これらのインストールに関しては、各アプリケーションのインストール・ガイドを参照してください (「参考文献」を参照)。
Apache ODE のインストール
ODE をダウンロードします。Apache Tomcat Web コンテナーを起動し、Tomcat Manager (お使いのコンピューターの http://localhost:8080/manager/html にあるはずです) を使ってディストリビューションのアーカイブから ode.war モジュールをデプロイします。インストールが成功したことを確認するためには、http://localhost:8080/ode/ にアクセスします。するとそのコンピューターの ODE Web サービスの状態が表示されるはずです。
Eclipse での BPEL サポート
Eclipse の BPEL プロジェクトをセットアップするためには、Eclipse アプリケーションを実行し、Eclipse のアップデート・マネージャーを起動し (メニューから Help (ヘルプ ) > Software Update (ソフトウェア更新) > Find & Install (検索およびインストール) の順にクリックします)、Search for new features to install (インストールする新規フィーチャーを検索) を選択します。さらに、New Remote Site... (新規リモート・サイト) をクリックし、New Update Site (新規更新サイト) ダイアログでは URL が http://download.eclipse.org/technology/bpel/update-site/ となるように入力し、このサイトに BPEL という名前を付けます。Finish (終了) をクリックし、近くのミラー・サイトを選択し、Eclipse 用のBPEL Designer を選択し、ライセンス条項に同意し、Select All (すべて選択) オプションですべてのフィーチャーを選択し、そして Next (次へ) と Finish (終了) をクリックします。Eclipse は、何らかの重複による競合が起こる可能性がある場合にはアラートを表示し、BPEL が署名されていないことを警告します。BPEL の提供者が Eclipse.org であれば Install (インストール) をクリックします。インストールが完了すると、Eclipse は Eclipse を再起動するように促します。
簡単な BPEL プロセスの作成
このセクションでは、簡単な BPEL プロセスを作成し、そのプロセスを ODE の中で実行してみます。このプロセスは簡単なストリング操作を行うにすぎません。これはあくまでも簡単な例であり、もっと複雑なプロセスを WS-BPEL V2.0 仕様を使って作成できることを忘れないでください。
Eclipse BPEL エディター
簡単な BPEL プロセスを作成するためには、Eclipse を実行してメニュー項目の File (ファイル) > New (新規) > Other (その他) をクリックし、オプション BPEL 2.0 -> BPEL Project を選択し、HelloWorld という新しい BPEL プロジェクトを作成します。このプロジェクトが作成できると、最初の BPEL プロセスを作成する準備ができたことになります。再度メニュー項目の File (ファイル) > New (新規) > Other (その他) をクリックしてオプション BPEL 2.0 > New BPEL Process File を選択し、BPEL プロセスを作成するウィザードを起動します。
図 1. BPEL プロセス・ファイルを作成する
HelloWorld という同じ名前の、同期プロセスを作成しましょう。このウィザードの次のページでは、BPEL プロセスのファイルの場所を選択する必要があります。そこで、先ほど作成したプロジェクトを選択し、Finish (終了) をクリックします。するとサンプル・プロセスが作成されます。
図 2. 同期プロセスを作成する
この図からわかるように、新たに作成されたプロセスには 2 つの内部 BPEL 変数 (input と output) と、1 つの receive 要素と 1 つの reply 要素から成るシーケンスとがあります。receive ブロックは入力される BPEL プロセス・データの受信と input 変数の初期化を行います。同様に、reply ブロックは output 変数を使って BPEL プロセス・データを出力することを目的としています。
また、このウィザードは BPEL プロセスを作成する際に WSDL ファイルも作成しました。このファイルは、入力と出力のデータ型と、BPEL プロセス表すポート・タイプを記述しています。入力と出力のデータ型は、どちらも単に 1 つのストリング・フィールドを含んでいるだけです。
これで、プロセスの中に少しばかりデータ操作を追加する準備ができました。データ操作を追加するには、receiveInput ブロックと replyOutput ブロックのちょうど真ん中に Assign ブロックをドラッグ・アンド・ドロップします。
図 3. Assign ブロックをドラッグ・アンド・ドロップする
Assign ブロックを配置できたら Assign ブロックを右クリックし、コンテキスト・メニュー項目 Show In Properties (プロパティーで表示) を選択して Properties (プロパティー) ビューを表示し、Details (詳細) タブを選択します。Assign ブロックは最初の XML タグの構造によって output 変数を初期化するはずです。これは大部分の BPEL 処理エンジンで要求される一般的な手順です。Details (詳細) タブで New (新規) ボタンをクリックし、最初の割り当て手順の作成を開始します。選択ボックス From (割り当て元) で Fixed Value (固定値) を選択し、テキスト・エリアに以下の行を入力します。
>tns:HelloWorldResponse xmlns:tns="http://www.ibm.com/wd2/ode/HelloWorld">
>tns:result/>
>/tns:HelloWorldResponse> |
次に、選択ボックス To (割り当て先) で Variable (変数) 要素を選択し、変数ツリーで output/payload 変数を選択します (下図参照)。
図 4. output 変数を初期化する
output 変数が初期化されると、新しい割り当て手順を作成することができます。このサンプル・プロセスでは、この手順によって入力変数からストリング値を取得し、それを「Hello」という挨拶と連結し、その連結した結果を出力変数のストリング・フィールドに割り当てます。そのためには New (新規) ボタンをクリックし、選択ボックス From (割り当て元) で値 Expression (式) を選択します。その下に表示されるテキスト・ボックスに concat("Hello ", $input.payload/tns:input) と入力します。To (割り当て先) セクションで変数 output/payload/tns:result を選択します (下図参照)。
図 5. output/payload/tns:result を選択する
これで Assign ブロックが用意できました。これを見るとわかるとおり、Eclipse の BPEL プラグインには XPath V1.0 の強調機能とコード補完機能が用意されており、XPath クエリーを簡単に作成できるようになっています (XPath について学ぶための資料は「参考文献」を参照してください)。
WSDL ファイルの変更
BPEL プロセス用の WSDL ファイルには、その BPEL プロセスに使われている型を記述するだけではなく、そのプロセスのポート・タイプとバインディング、そしてサービスも記述する必要があります。ウィザードによって自動的に作成された WSDL には既にポート・タイプが含まれているため、プロセスを動作可能にするためには、プロセスのバインディングとサービスを作成する必要があります。
適当なエディターで WSDL ファイルを開き、ポート・タイプのグラフィカルな定義を調べます。
図 6. ポート・タイプのグラフィカルな定義を調べる
Web サービスのバインディングを作成するためには、WSDL エディターの中の何もない領域で右クリックし、Add Binding (バインディングの追加) オプションを選択します。新たに作成されたバインディングを Properties (プロパティー) ビューで HelloWorldBinding とリネームし、新しいバインディングのポート・タイプとして HelloWorld を選択します。Generate Binding Content (バインディングのコンテンツを生成) ボタンをクリックすると Binding Wizard (バインディング・ウィザード) のダイアログが表示されます。
図 7. Binding Wizard (バインディング・ウィザード) のダイアログ
選択ボックス Protocol (プロトコル) で SOAP プロトコルを選択し、SOAP Binding Options (SOAP バインディング・オプション) セクションで document literal (ドキュメント・リテラル) オプションを有効にして、Finish (終了) をクリックします。
図 8. バインディング・オプション
バインディングが作成されたら、WSDL エディターの何もない領域で右クリックし、メニュー項目 Add Service を選択して新しいサービスを HelloWorldService という名前で作成します。次にバインディングのポート名に HelloWorldPort を、アドレスとして URL http://localhost:8080/ode/processes/HelloWorld を指定します。また新しく作成されたサービスに対するバインディングとして HelloWorldBinding を選択します。
図 9. HelloWorldBinding
これでこの WSDL ファイルを ODE アプリケーションにデプロイする準備ができました。
デプロイメント記述子
このプロセスをデプロイできるようにするための最後の準備として、ODE 記述子を作成する必要があります。この記述子は deploy.xml という名前を持つ必要があり、また BPEL ファイルと WSDL ファイルが保存されているディレクトリーと同じディレクトリーに置く必要があります。そこで、新しいテキスト・ファイル deploy.xml を作成し、そこに次のような内容を入力します。
リスト 1. テキスト・ファイル deploy.xml を作成する
>?xml version="1.0" encoding="UTF-8"?>
>deploy xmlns="http://ode.fivesight.com/schemas/2006/06/27/dd"
xmlns:pns="http://www.ibm.com/wd2/ode/HelloWorld"
xmlns:wns="http://www.ibm.com/wd2/ode/HelloWorld">
>process name="pns:HelloWorld">
>active>true>/active>
>provide partnerLink="client">
>service name="wns:HelloWorldService" port="HelloWorldPort"/>
>/provide>
>/process>
>/deploy> |
この記述子は、デプロイ可能な単位に対するプロセスとサービスのリストを規定しています。
BPEL プロセスの使い方
さて、HelloWorld という BPEL プロセスが用意できると、このプロセスを ODE アプリケーションにデプロイし、テストすることができます。
BPEL プロセスを ODE にデプロイする
ODE は BPEL プロセスのホット・デプロイメントをサポートしています。この前のセクションで作成したプロセスをデプロイするためには、このプロセスのすべてのファイルを含むフォルダーを、ODE がデプロイされている Apache Tomcat の webapps/ode/WEB-INF/processes ディレクトリーにコピーするだけです。デプロイメント・プロセスをモニターするためには、Tomcat のルート・ディレクトリーにあるログ・ファイル logs/catalina.out を調べ、新しいエントリーを探します。
デプロイされたプロセスをテストするための簡単な方法として、Eclipse の Web Services Explorer ツールを使う方法があります。WSDL ファイル HelloWorld を右クリックし、ポップアップ・メニュー項目の Web Services (Web サービス) > Test with Web Services Explorer (Web Services Explorer を使ったテスト) を選択します。すると Eclipse によって Web Services Explorer テスト・ツールが起動されます。このツールを使って入力パラメーターに何かテキストを入力し、Process 操作を呼び出すと、この Web サービスは直前に入力されたテキストに対して挨拶を返します (図 10)。
図 10. WSDL 操作を呼び出す
BPEL プロセスのクライアントを作成する
BPEL プロセスを実行する Web サービスがあると、このプロセスをクライアント・アプリケーションの中に統合することができます。Eclipse の WTP プラグインを使って Axis ベースの Web サービス・クライアントを生成しましょう。クライアント・コードを生成する前に、Eclipse サーバーのリストに Tomcat サーバーを追加する必要があります。メニュー項目の File (ファイル) > New (新規) > Other (その他) をクリックし、リストから Server オプションを選択します。次にウィザードによるステップに従って、Eclipse ワークスペースのための新しい Tomcat サーバーを作成します。
サーバーが作成されたら、WSDL ファイルを右クリックし、ポップアップ・メニュー項目で Web Services (Web サービス) > Generate Client (クライアントを生成) を選択します。このアクションによって Web Service Client ウィザードが起動し、その Web サービスを使った動作に必要なクラスを持つ新しいプロジェクトが生成されます。
図 11. Web サービスのクライアントをセットアップする
生成されたファイルを扱うためには、次のようなコードを使います。
リスト 2. Web サービスのクライアントを作成する
HelloWorldServiceLocator locator = new HelloWorldServiceLocator();
HelloWorldRequest hwRequest = new HelloWorldRequest();
hwRequest.setInput("developerWorks!");
HelloWorldResponse hwResponse = locator.getHelloWorldPort().process(hwRequest);
String output = hwResponse.getResult(); |
このコードが実行されると、output 変数には BPEL プロセスによる動作の結果が含まれているはずです。
ODE の管理 API
ODE では、アプリケーションの管理機能の一部に Web サービスを介してアクセスすることができます。この機能を利用すると、サーバー上で現在実行されている、ODE にデプロイされたプロセスと、そのプロセスのインスタンスとをコントロールすることができます。すべての操作は、Tomcat アプリケーションの webapps/ode/WEB-INF フォルダーの中にある pmapi.wsdl ファイルに記述されています。残念ながら pmapi.wsdl は古い RPC ドキュメント・スタイルを使用しており、このファイルを例えば Eclipse の Web Services Explorer テスト・ツールで使うのは困難です。
管理 API にアクセスする最も良い方法は、Axis2 ライブラリー、特に ode-axis2 ライブラリーに提供されている ServiceClientUtil クラスを使うことです。Axis2 は Xerces や Stax などの他のライブラリーに依存します。これらのライブラリーの大部分は ode.war アーカイブに含まれているため、このアーカイブをプロジェクトの依存関係に追加することができます。
次のコードは、現在のプロセス・インスタンスに関する情報を抽出する方法を示しています。
リスト 3. 現在のプロセス・インスタンスに関する情報を抽出する
ServiceClientUtil client = new ServiceClientUtil();
OMElement msg = client.
buildMessage("listAllInstances", new String[] {}, new String[] {});
OMElement result =
client.send(msg, "http://localhost:8080/ode/processes/InstanceManagement");
List>ProcessInfo> processes = new ArrayList>ProcessInfo>();
Iterator>OMElement> i = result.getChildElements();
while (i.hasNext()) {
OMElement omInstanceInfo = i.next();
OMElement omProcessName =
omInstanceInfo.getFirstChildWithName(
new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
"process-name"));
OMElement omStatus =
omInstanceInfo.getFirstChildWithName(
new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
"status"));
OMElement omStarted =
omInstanceInfo.getFirstChildWithName(
new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
"dt-started"));
OMElement omLastActive =
omInstanceInfo.getFirstChildWithName(
new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/",
"dt-last-active"));
ProcessInfo process = new ProcessInfo();
process.setProcessName(omProcessName.getText());
process.setStatus(omStatus.getText());
process.setStarted(omStarted.getText());
process.setLastActive(omLastActive.getText());
processes.add(process);
} |
この例は、axiom ライブラリーを使って情報を取得し、その情報を ProcessInfo オブジェクトのリストとして保存しています。これらのオブジェクトはアプリケーションの任意の部分から利用することができます。
ODE イベント・リスナー
ODE を利用すると、ODE アプリケーション内部の任意のアクション (例えばプロセス・インスタンスの起動や停止など) に対するリスナーを作成することができます。独自のイベント・リスナーを作成するためには、ode-bpel-api.jar ライブラリーの中で定義されている org.apache.ode.bpel.iapi.BpelEventListener インターフェースを実装する必要があります。下記のコードは、リスナー・メソッド startup() と shutdown() の呼び出しと受信したイベントを標準の出力ストリームに出力する簡単な実装を示しています。
リスト 4. リスナー・メソッド startup() と shutdown()
/**
* {@inheritDoc}
*/
public void onEvent(BpelEvent event) {
System.out.println(event);
}
/**
* {@inheritDoc}
*/
public void startup(Properties arg0) {
System.out.println(this.getClass() + " startup");
}
/**
* {@inheritDoc}
*/
public void shutdown() {
System.out.println(this.getClass() + " shutdown");
} |
リスナー・クラスが用意できたら、そのクラスを ODE のクラスパスに置く必要があります (リスナー・クラスと共に JAR ファイルを Tomcat の webapps/ode/WEB-INF/lib ディレクトリーに置きます)。また、プロパティー・ファイル webapps/ode/WEB-INF/conf/ode-axis2.properties を作成し、そこに次の行を追加する必要があります。
ode-axis2.event.listeners=com.ibm.wd2.bpel.eventlistener.WD2EventListener |
皆さんが作成するリスナー・クラスの名前は上記の名前とは異なるかもしれません。
まとめ
BPEL V2.0 は、BPEL 以外の大量のコンポーネントや Web サービスから構成される複雑なアプリケーションの開発を支援するための強力な言語です。BPEL を利用すると、グラフィカル・エディターを使って長期にわたり実行されるワークフローを記述することができ、人間が理解しやすい図でワークフローを表現することができます。BPEL V2.0 仕様を使用したアプリケーションの作成には、Apache コミュニティーと Eclipse コミュニティーから提供されるオープンソースの製品を組み合わせて使うことができます。つまりプロセスの開発に Eclipse の BPEL プロジェクトを、そしてプロセスの実行に Apache の ODE を利用することができます。どちらの製品も、少なくとも上に示したような単純な BPEL V2.0 プロセスに対しては適切に動作します。しかし、これらのオープンソース・ツールを実際のビジネス・アプリケーションに使用することを決断する前に、これらのツールを複雑なアプリケーションに使う場合の長所と短所を十分調べることをお勧めします。
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | |  | Ilya Platonov は、ロシア・ノボシビルスクにある IBM Advanced Technology Solutions (ATS) Lab の顧問を務める Axmor Software のソフトウェア・エンジニアです。ノボシビルスク州立大学でコンピューター・サイエンスの修士号を取得しました。最近は、5 つを越える ATS プロジェクトにシステム・アーキテクトあるいはソフトウェア・エンジニアとして参加しています。 |
 | |  | Artem Papkov は、現在 IBM Client Innovation Team のソリューション・アーキテクトで、カスタマーやビジネス・パートナーと協力して SOA および Web サービスなどの新しい技術を導入しています。1998 年、Belarusian State University of Informatics and Radioelectronics でコンピューター・サイエンスの博士号を取得後、2000年にノースカロライナ州リサーチ・トライアングル・パーク所在の IBM に加わりました。新しい技術を使用した多層ソリューションのソフトウェア開発、アーキテクチャー設計、およびインターネット・ベース・ソリューションの経験を持ちます。過去 3 年間は、カスタマーと密に連携して IBM の戦略的統合技術としての Web サービス、および統合手法としての SOA の導入を支援しています。Artem の連絡先は、artem@us.ibm.com です。 |
 | |  | Jim Smith は、ソフトウェア開発の分野で 18 年以上の経験を持ちます。彼の経歴は、カリフォルニア州リバーモアの Sandia National Labs での、無数の既存のレガシー・コードを使用した高速データ収集システムおよび分散コンピューティング・システムの設計に始まります。Java 言語とカスタマー向き技術に豊富な経験を持つ彼は、IBM カスタマーのための Java ソリューションの実現に的を絞った Emerging Internet Technologies チームに移りました。彼は、ATS (Advanced Technology Solutions) の設立者の 1 人です。これは、IBM、開発研究所、ビジネス・パートナー、およびカスタマーのための先進技術と軽量ビジネス・プロセスを開発、洗練、および特権付与し、標準技術と IBM 製品の導入とデプロイメントをさらに高速化する使命を持つ世界的なソフトウェア・サービスおよび開発組織です。現在 Jim は、この組織を管理しています。 |
記事の評価
|