高度なワークフロー・パターンを WebSphere Integration Developer と WebSphere Process Server で実装する: 第 2 回 複数インスタンス・パターンと繰り返しパターン

連載の第 1 回で強調したように、WPI (Workflow Patterns Initiative) は、企業がワークフローをモデル化するときに広く使用、あるいは参照されていますが、その最新の 43 のワークフロー・パターンは、あらゆる種類の BPEL エンジンに大きな課題を投げかけています。

WebSphere Process Server (WPS) は、パフォーマンスに優れた強力なビジネス・プロセス自動化エンジンです。WPS と WebSphere Integrated Developer (WID) を使うことで、ユーザーはそのワークフロー・パターンを簡単に実装することができます。この記事では、最新の WebSphere Process Server V7.0 と WebSphere Integrated Developer V7.0 では 43 すべてのパターンを実装できるというだけでなく、いかに簡単にワークフロー・パターンを実装できるようにしているかを明らかにします。

Ying Ji Sun, Staff Software Engineer, IBM

Ying Ji Sun は現在、WebSphere Process Server SWAT チームに参加しています。以前は WebSphere Enterprise Service Bus 機能検証テストに取り組んでいた彼は、Web サービスおよび WebSphere Enterprise Service Bus を話題に取り上げた developerWorks 記事もいくつか書いています。



Yu Jie Gu , Staff Software Engineer, IBM

Yu Jie Gu は現在、WebSphere Process Server Level 3 サポート・チームのメンバーです。



Jing Wen Cui , Software Engineer, IBM

Jing Wen Cui は、3 年以上、WebSphere Process Server のテストに取り組んでいます。彼はワークフロー、BPEL、および関連する WebSphere 製品についても熟知しています。



2010年 10月 19日

はじめに

連載の第 1 回で述べたように、Workflow Patterns Initiative (WPI) は、ビジネス・プロセスをモデル化する際に繰り返し持ちあがってくる基本的な要件を図で表現し、そうした図の要素を順次つないでいくことで要件全体を記述することを目的に策定されました。WPI は、企業がワークフローをモデル化するときに広く使用、または参照されています。2003年に WPI の最初のバージョンとして発表されたパターンは 20 でしたが、最新リリースではその数が 43 にまで増えています。これらのパターンは、あらゆる種類の BPEL エンジンに大きな課題を投げかけています。このそれぞれのパターンをサポートするのは極めて困難だからです。これを言い換えれば、このすべてのパターンをサポートできる 1 つの BPEL エンジンがあれば、強化されたその能力の分だけ、多くのユーザーを獲得できるということになります。

この連載の第 2 回では、2 つのカテゴリーのパターン (複数インスタンス・パターンと繰り返しパターン) について詳しく説明します。


複数インスタンス・パターンと繰り返しパターン

このカテゴリーには、以下の 9 つのパターンがあります。

  1. 同期合成を行わない複数インスタンス (Multiple Instances without Synchronization)
  2. 設計時に数が既知の複数インスタンス (Multiple Instances with a Priori Design-Time Knowledge)
  3. 実行時に数が既知の複数インスタンス (Multiple Instances with a Priori Run-Time Knowledge)
  4. 実行時に数が不定の複数インスタンス (Multiple Instances without a Priori Run-Time Knowledge)
  5. 複数インスタンスの静的部分結合 (Static Partial Join for Multiple Instances)
  6. 複数インスタンスの部分結合によるキャンセル (Cancelling Partial Join for Multiple Instances)
  7. 複数インスタンスの動的部分結合 (Dynamic Partial Join for Multiple Instances)
  8. 任意サイクル (Arbitrary Cycles)
  9. 構造化ループ (Structured Loop)

以上のパターンは分岐と合成の概念に関連するもので、現実のビジネス・プロセスで広く使用されています。このうち、WID 7 BPC エディターで簡単に実装できるパターンもあれば、WID 7 SCA アセンブリー構造が必要なパターンもあります。


「同期合成を行わない複数インスタンス」パターン

「同期合成を行わない複数インスタンス (Multiple Instances without Synchronization)」パターンでは、ある特定のプロセス・インスタンスで複数のタスク・インスタンスが作成されます。これらのインスタンスは、完了時に同期合成する必要はありません。

例えば、「approveVacationRequest (休暇要求の承認)」という名前のタスクがあるとします。このタスクでは、複数のインスタンスを同時に作成して処理することができます。これらのインスタンスを同期合成する必要はありません。

分析

このパターンの焦点は以下のとおりです。

  1. タスクの複数のインスタンスをそれぞれ個別に作成することができます。
  2. 完了時に同期合成する必要はありません。
  3. インスタンスはそれぞれ独立して実行する必要があります。

実装

図 1. 同期合成を行わない複数インスタンス
同期合成を行わない複数インスタンス

このパターンは、<foreach> の中に含まれる <invoke> 文によってサポートされます。

リスト 1. MultiInstancesInvokeeImpl での操作 1
addCounter();
System.out.println("[MultiInstancesInvokee] invoked time is: " +  counter);
input1.setInt("field3", counter );
return input1;

テスト・データ

field2=2: 想定される結果: SCA コンポーネントが 2 回呼び出されることです。


「設計時に数が既知の複数インスタンス」パターン

「設計時に数が既知の複数インスタンス (Multiple Instances with a Priori Design-Time Knowledge)」パターンでは、ある特定のプロセス・インスタンス内で作成された複数のインスタンスが、作成処理の完了時に同期合成されます。インスタンスの数は、設計時に知ることができます。

例えば、テスト計画が、テスト・リーダー、コンポーネント開発者、アーキテクト、およびテスターによって承認されなければならないとします。

分析

このパターンの焦点は以下のとおりです。

  1. 複数のインスタンスが作成されます。
  2. 必要なインスタンスの数は、設計時に既知となります。
  3. 完了時にインスタンスを同期合成する必要があります。

実装

図 2. 設計時に数が既知の複数インスタンス
設計時に数が既知の複数インスタンス

スコープ内で dataCollection という変数を初期化します。dataCollection は、「setTheResultintoDataCollection (データ・コレクションへの結果書き込み)」アクティビティーのデータを収集するための変数です。他のアクティビティーを並行して呼び出すには、「ForEach (繰り返し)」アクティビティーを使用します。

以下の 2 つのリストに、「InitDataCollection (データ・コレクション初期化)」アクティビティーおよび「setTheResultintoDataCollection (データ・コレクションへの結果書き込み)」アクティビティーのスニペットを記載します。

リスト 2. InitDataCollection
commonj.sdo.DataObject __result__1;
{// create DataCollection
	com.ibm.websphere.bo.BOFactory factory = 
	   (com.ibm.websphere.bo.BOFactory) new com.ibm.websphere.sca.ServiceManager().
                                    locateService("com/ibm/websphere/bo/BOFactory");
	 __result__1 = factory.create("http://PatternsDemo","DataCollection");
}
dataCollection = __result__1;
リスト 3. setTheResultintoDataCollection
List list = dataCollection.getList("ProcessDataArray");
list.add(output1);

テスト・データ

field2=2: 想定される結果: SCA コンポーネントが 2 回呼び出され、それぞれの呼び出しに対する応答データが配列に収集されることです。


「実行時に数が既知の複数インスタンス」パターン

「実行時に数が既知の複数インスタンス (Multiple Instances with a Priori Run-Time Knowledge)」パターンでは、ある特定のプロセス・インスタンス内で作成された複数のインスタンスが、作成処理の完了時に同期合成されます。インスタンスの数は、実行時に関係する要素によって変わります。

例えば、複数の審査員によってテスト計画を承認しなければならないとします。審査員の数は、ケース・バイ・ケースで異なります。

分析

このパターンの焦点は以下のとおりです。

  1. 複数のインスタンスが作成されます。
  2. 必要なインスタンスの数は、実行時に関係する要素によって変わります。
  3. 完了時にインスタンスを同期合成する必要があります。

実装

図 3. 実行時に数が既知の複数インスタンス
実行時に数が既知の複数インスタンス

上記の実装は「設計時に数が既知の複数インスタンス (Multiple Instances with a Priori Design-Time Knowledge)」パターンと似ていますが、「ManualSetIndex (手動でのインデックス設定)」というヒューマン・タスクが含まれている点が異なります。このタスクによって値を output1/field2 に設定し、この値を「AssignIndex (インデックス割り当て)」アクティビティーで indexnumber 変数に転送します。

テスト・データ

  1. 任意の値を入力してプロセスを開始します。
  2. 次に「My to-do」に進み、「ManualSetIndex (手動でのインデックス設定)」タスクを要求して field2=2 を指定します。
  3. 想定される結果: SCA コンポーネントが 2 回呼び出され、それぞれの呼び出しに対する応答データが配列に収集されることです。

「実行時に数が不定の複数インスタンス」パターン

「実行時に数が不定の複数インスタンス (Multiple Instances without a Priori Run-Time Knowledge)」パターンでは、ある特定のプロセス・インスタンス内で作成された複数のインスタンスが、作成処理の完了時に同期合成されます。インスタンスの数は、実行時に関係する要素によって変わります。このパターンでさらに重要な点は、実行時にインスタンスを追加できることです。

例えば、チームの外出計画を承認するには、通常はチーム・メンバーの半数の承認が必要ですが、それよりも多くのメンバーからの承認が必要となる、特殊なケースもあります。

分析

このパターンの焦点は以下のとおりです。

  1. 複数のインスタンスが作成されます。
  2. 必要なインスタンスの数は、実行時に関係する要素によって変わります。
  3. 実行時にインスタンスを追加することができます。
  4. 完了時にインスタンスを同期合成する必要があります。

実装

図 4. 実行時に数が不定の複数インスタンス
実行時に数が不定の複数インスタンス

このパターンを実装するには、サブタスクを使用します。サブタスクについての詳細は、http://publib.boulder.ibm.com/bpcsamp/v6r2/humanTaskFeatures/subtask.html を参照してください。注: 「HumanTask2CreateSubtask (ヒューマン・タスクによるサブタスク作成)」アクティビティーの「サブタスク作成の有効化」属性を有効にする必要があります。


「複数インスタンスの静的部分結合」パターン

「複数インスタンスの静的部分結合 (Static Partial Join for Multiple Instances)」パターンでは、ある特定のプロセス・インスタンス内で作成された複数のインスタンスが、作成処理の完了時に同期合成されます。プロセスの次のタスクは、インスタンスの一部が完了するとトリガーされます。

例えば、ある調査を行っていて、メンバーの 70% からフィードバックを取得した時点で調査を完了し、残りのメンバーからのフィードバック結果は無視するとします。

分析

このパターンの焦点は以下のとおりです。

  1. 複数のインスタンスが作成されます。
  2. 必要なインスタンスの数は、最初のタスクが開始されるときに既知になっています。
  3. 次のタスクは、m 個のインスタンスのうちの n 個が完了した時点でトリガーすることができます。
  4. 残りのインスタンスの結果は重要視されません。

実装

図 5. 複数インスタンスの静的部分結合
複数インスタンスの静的部分結合

このパターンを実装するには、「EventHandler (イベント・ハンドラー)」を使用します。新しく作成するタスク・インスタンスの数は、「ForEach (繰り返し)」アクティビティーが含まれる「Scope1 (スコープ 1)」で制御します。「HumanTask (ヒューマン・タスク)アクティビティーで input1 変数を初期化します。「HumanTask (ヒューマン・タスク)」が完了すると、次に「Invoke (呼び出し)」アクティビティーがトリガーされてプロセスが「OnEvent (イベント処理)」スコープに移ります。

「OnEvent (イベント処理)」スコープでは count 変数によってタスクの数をカウントします。カウントが iteration の値に達している場合、プロセスは次のアクティビティーに進みます。

注: 複数の受信アクティビティーがあるため、相関セットを定義する必要があります。

テスト・データ

入力データとして、P34BO1 タイプの配列と、iteration の値を設定する整数を入力する必要があります。配列の数は、iteration より大きくすることをお勧めします。2 つのヒューマン・タスク・アクティビティーを要求して完了すると、ログには以下の内容が記録されているはずです。

[10-10-3 10:38:42:921 CST] 0000004c SystemOut     O Index: 1
[10-10-3 10:38:44:500 CST] 0000004c SystemOut     O Index: 2
[10-10-3 10:38:44:718 CST] 0000004c SystemOut     O Index: 3
[10-10-3 10:39:16:234 CST] 0000004c SystemOut     O count: 1
[10-10-3 10:39:16:234 CST] 0000004c SystemOut     O iteration: 2
[10-10-3 10:39:16:234 CST] 0000004c SystemOut     O iteration > count
[10-10-3 10:39:23:218 CST] 0000004c SystemOut     O into next activity

「複数インスタンスの部分結合によるキャンセル」パターン

「複数インスタンスの部分結合によるキャンセル (Cancelling Partial Join for Multiple Instances)」パターンでは、ある特定のプロセス・インスタンス内で作成された複数のインスタンスが、作成処理の完了時に同期合成されます。プロセスの次のタスクは、インスタンスの一部が完了するとトリガーされます。それと同時に、残りのインスタンスがキャンセルされます。

例えば、何かを決める投票を行っているとします。しきい値に達した時点で他の票を投じる必要はなくなるため、残りの投票タスクはキャンセルされます。

分析

このパターンの焦点は以下のとおりです。

  1. 複数のインスタンスが作成されます。
  2. 必要なインスタンスの数は、最初のタスクが開始されるときに既知になっています。
  3. 次のタスクは、m 個のインスタンスのうちの n 個が完了した時点でトリガーできます。
  4. 残りのインスタンスの結果はキャンセルされます。

実装

図 6. 複数インスタンスの部分結合によるキャンセル
複数インスタンスの部分結合によるキャンセル

このパターンを実装するには、WPS V7.0 および WID V7.0 の両方に追加された新機能、並列タスクを使用します。

テスト・データ

プロセス・インスタンスが初期化されると、3 つのヒューマン・タスクが作成されます。この 3 つのヒューマン・タスクのうち、2 つが完了するとプロセスは次のアクティビティーに進み、残りの 1 つはキャンセルされます。


「複数インスタンスの動的部分結合」パターン

「複数インスタンスの動的部分結合 (Dynamic Partial Join for Multiple Instances)」パターンでは、ある特定のプロセス・インスタンス内で作成された複数のインスタンスを完了時に同期合成する必要があります。インスタンスの数は、実行時に関係する要素によって変わります。このパターンでさらに重要な点は、実行時にインスタンスを追加できることです。完了条件は、タスクのインスタンスが完了するごとに指定されます。

例えば、あるチームで採決のための投票を行っているとします。他のチームのメンバーを投票に関与させる必要があるか、あるいは他のチームが関与できないようにするかは、チーム・リーダーが決定します。

分析

このパターンの焦点は以下のとおりです。

  1. 複数のインスタンスが作成されます。
  2. 必要なインスタンスの数は、実行時に関係する要素によって変わります。
  3. 実行時にインスタンスを追加することができます。
  4. 切り替えの追加は、無効にすることができます。
  5. 完了条件は、タスクのインスタンスが完了するごとに指定されます。

実装

図 7. 複数インスタンスの動的部分結合
複数インスタンスの動的部分結合

このパターンを実装するには、WPS の「EventHandler (イベント・ハンドラー)」および「FaultHandler (障害ハンドラー)」機能を使用します。「FaultHandler (障害ハンドラー)」(「Catch (キャッチ)」アクティビティーを参照) では、タスク・インスタンスの完了をシミュレートします。ユーザーがアクティビティーに移りたい場合には、UserChooseToFinishFault という例外をスローします。すると、プロセスは「Snippet7 (スニペット 7)」に移って続行されます。

今回は 3 つのスコープがあります。まず「ForEach (繰り返し)」スコープでは、入力パラメーターとその他の変数を初期化し、「ForEach (繰り返し)」アクティビティーでタスク・インスタンスを作成します。「Scope1 (スコープ 1)」では、コマンドがアクティビティーを追加するか、またはアクティビティーの追加が無効にされるまで待機します。「WhetherToAddTask (タスク追加の判断)」は、このようなコマンドを受け取るアクティビティーです。「Invoke (呼び出し)」アクティビティーは、「ForEach (繰り返し)」スコープ内のヒューマン・タスクと同じタスクを呼び出します。「onEvent (イベント処理)」スコープでは「複数インスタンスの静的部分結合 (Static Partial Join for Multiple Instances)」パターンでの場合と同様の機能を実行しますが、このパターンではタスクが完了してもインスタンスを同期合成しません。

注: 受信アクティビティーは複数あるため、相関セットを定義する必要があります。

テスト・データ

プロセスの入力パラメーターとして、3 つの要素が含まれる BO 配列を指定し、processId を 11111 に設定します。作成されるヒューマン・タスクは 4 つあります。3 つのヒューマン・タスクと 1 つの「WhetherToAddTask (タスク追加の判断)」アクティビティーです。

[10-10-3 11:00:15:484 CST] 0000004c SystemOut     O Initialize
[10-10-3 11:00:15:500 CST] 0000004c SystemOut     O AddNewTask
[10-10-3 11:00:17:906 CST] 0000006d SystemOut     O Entry HumanTask
[10-10-3 11:00:19:687 CST] 0000006d SystemOut     O Entry HumanTask
[10-10-3 11:00:19:921 CST] 0000004c SystemOut     O Entry HumanTask
[10-10-3 11:00:25:656 CST] 0000004b SystemOut     O into while loop

ヒューマン・タスクの完了を試行することができます。processId は 11111 に設定し、field3 は false に設定する必要があることに注意してください。

[10-10-3 11:05:14:546 CST] 0000003f SystemOut     O Exit HumanTask
[10-10-3 11:05:15:750 CST] 0000006d SystemOut     O User choose NOT to finish

この時点ではまだ、新しいタスクの追加を待っている状態です。ここで、新しいタスクを追加してみます。output1 の field1 を true に設定してください。

[10-10-3 11:06:43:468 CST] 0000003e SystemOut     O User choose to add more tasks 
[10-10-3 11:06:43:468 CST] 0000003e SystemOut     O processId:11111
[10-10-3 11:06:43:859 CST] 0000004c SystemOut     O Event triggered
[10-10-3 11:06:46:781 CST] 0000004c SystemOut     O into while loop
[10-10-3 11:06:47:265 CST] 0000006d SystemOut     O Adding new HumanTask
[10-10-3 11:06:47:796 CST] 0000004c SystemOut     O Entry HumanTask

ここにも同じく 3 つのヒューマン・タスクがあり、「WhetherToAddTask (タスク追加の判断)」アクティビティーは次に続くコマンドでも存在します。「WhetherToAddTask (タスク追加の判断)」アクティビティーで field1 を false に設定すると、「WhetherToAddTask (タスク追加の判断)」アクティビティーは存在しなくなることがわかります。

[10-10-3 11:06:47:796 CST] 0000004c SystemOut     O Entry HumanTask
[10-10-3 11:09:51:046 CST] 0000003c SystemOut     O User choose NOT add any task

これで、ヒューマン・タスクを処理し、field3 をtrue に設定すれば、次のアクティビティーに移ることができます。プロセスは、「Snippet7 (スニペット 7)」に進みます。

[10-10-3 11:11:49:171 CST] 0000003c SystemOut     O Exit HumanTask
[10-10-3 11:11:49:828 CST] 0000004c SystemOut     O User choose to finish

「任意サイクル」パターン

「任意サイクル (Arbitrary Cycles)」パターンは、プロセス内のサイクルに関するパターンです。サイクルに従って、複数のアクティビティーへの出入りを繰り返すことができます。

実装

図 8. 任意サイクル
任意サイクル

このパターンを実装するには、WPS V7.0 および WID V7.0 の「Generalized Flow (汎用フロー)」機能を使用します。

テスト・データ

テスト・データ 1:

  1. 任意の値を入力してプロセスを開始します。
  2. 「My to-do」に進み、「ArbitraryCyclesTask1 (任意サイクル・タスク 1)」を要求して field1 に任意の値を入力します。
  3. 「My to-do」に進み、今度は「ArbitraryCyclesTask2 (任意サイクル・タスク 2)」を要求して field1 に任意の値を入力します。
  4. 想定される結果: 以下のアクティビティーが順に呼び出されることです。
    • Snippet1、Snippet2、Snippet3、Snippet4、Snippet5

テスト・データ 2:

  1. 任意の値を入力してプロセスを開始します。
  2. 「My to-do」に進み、「ArbitraryCyclesTask1 (任意サイクル・タスク 1)」を要求して field1 に「redo1」と入力します。
  3. 「My to-do」に進み、新しい「ArbitraryCyclesTask1 (任意サイクル・タスク 1)」を要求して field1 に任意の値を入力します。
  4. 「My to-do」に進み、今度は「ArbitraryCyclesTask2 (任意サイクル・タスク 2)」を要求して field1 に任意の値を入力します。
  5. 想定される結果: 以下のアクティビティーが順に呼び出されることです。
    • Snippet1、Snippet2、Snippet3、Snippet2、Snippet3、Snippet4、Snippet5

テスト・データ 3:

  1. 任意の値を入力してプロセスを開始します。
  2. 「My to-do」に進み、「ArbitraryCyclesTask1 (任意サイクル・タスク 1)」を要求して field1 に任意の値を入力します。
  3. 「My to-do」に進み、「ArbitraryCyclesTask2 (任意サイクル・タスク 2)」を要求して field1 に「redo2」と入力します。
  4. 「My to-do」に進み、新しい「ArbitraryCyclesTask1 (任意サイクル・タスク 1)」を要求して field1 に任意の値を入力します。
  5. 「My to-do」に進み、新しい「ArbitraryCyclesTask2 (任意サイクル・タスク 2)」を要求して field1 に任意の値を入力します。
  6. 想定される結果: 以下のアクティビティーが順に呼び出されることです。
    • Snippet1、Snippet2、Snippet3、Snippet2、Snippet3、Snippet4、Snippet3、Snippet4、Snippet5

「構造化ループ」パターン

「構造化ループ (Structured Loop)」パターンは、プロセス内のループに関するパターンです。このパターンでは、プロセスに事前テストや事後テストの条件を設定することができます。つまり、for ループと while ループのことです。

実装

「ForEach (繰り返し)」機能を使用して、構造化ループを以下のように実装します。

図 9. 構造化ループ
構造化ループ

構造化ループ (事前テスト) を実装するには、以下のように「WhileLoop (while ループ)」機能を使用します。

図 10. 構造化ループ (事前テスト)
構造化ループ (事前テスト)

構造化ループ (事後テスト) を実装するには、以下のように「RepeatUntilLoop (repeat until ループ)」機能を使用します。

図 11. 構造化ループ (事後テスト)
構造化ループ (事後テスト)

まとめ

この記事では 7 つの複数インスタンス・パターンと 2 つの繰り返しパターンを、それぞれに関連する WID 実装と併せて紹介しました。これらのワークフロー制御パターンを使用すれば、複雑なビジネス・プロセスでも簡単に構成することができます。


ダウンロード

内容ファイル名サイズ
PI files for this articlePart2PI.zip178KB

参考文献

学ぶために

製品や技術を入手するために

  • ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。また、SOA Sandbox では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。

議論するために

  • My developerWorks コミュニティーに加わってください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=SOA and web services, WebSphere
ArticleID=587589
ArticleTitle=高度なワークフロー・パターンを WebSphere Integration Developer と WebSphere Process Server で実装する: 第 2 回 複数インスタンス・パターンと繰り返しパターン
publish-date=10192010