高度なワークフロー・パターンを WebSphere Integration Developer と WebSphere Process Server で実装する: 第 3 回 高度な分岐および同期合成パターン

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

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

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 製品についても熟知しています。



Ying Ji Sun , Staff Software Engineer, IBM

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



2010年 10月 28日

概要

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

連載第 3 回では、高度な分岐および同期合成パターンについて詳しく説明します。


高度な分岐および同期合成パターン

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

  1. 多重選択 (Multi-Choice)
  2. 多重合成 (Multi-Merge)
  3. スレッド分割 (Thread Split)
  4. スレッド合成 (Thread Merge)
  5. 構造化部分結合 (Structured Partial Join)
  6. 部分結合のブロック (Blocking Partial Join)
  7. 部分結合のキャンセル (Cancelling Partial Join)
  8. 構造化弁別 (Structured Discriminator)
  9. 弁別のブロック (Blocking Discriminator)
  10. 弁別のキャンセル (Cancelling Discriminator)
  11. 一般的 AND 結合 (Generalized AND-Join)
  12. 構造化同期合成 (Structured Synchronizing Merge)
  13. ローカル同期合成 (Local synchronizing merge)
  14. 全般同期合成 (General synchronizing merge)

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


「多重選択」パターン

「多重選択 (Multi-Choice)」パターンでは、入力ブランチが有効になった後、選択条件に基づいて複数の出力ブランチが選択できるようになります。

例えば、ある工場で生産規模を拡大するために資本を投下し、その時点での状況に応じてスタッフの採用、機器の購入、作業場の拡張をすべて同時に開始するという場合があります。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

分析

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

  1. ゲートウェイには 1 つの入力ブランチと複数の出力ブランチがあります。
  2. 出力ブランチは、事前に定義された選択条件に基づいて選択されます。
  3. 1 つあるいは複数の出力ブランチが有効になります。

実装

図 1. 多重選択の実装 – SCA コンポーネント
SCA コンポーネント
図 2. 多重選択の実装 – BPC 実装
BPC 実装

選択条件は、「Receive (受信)」アクティビティーの入力に応じて定義され、ゲートウェイの出力リンクに設定されます。「Case1 (ケース 1)」と「Case 2 (ケース 2)」はプロセス入力パラメーターに従って実行されます。「Case 3 (ケース 3)」は、無条件に実行されます。

「Receive (受信)」アクティビティーのインターフェースは以下のとおりです。

図 3. 「Receive (受信)」アクティビティーのインターフェース
「Receive (受信)」アクティビティーのインターフェース
図 4. ProcessData ビジネス・オブジェクトの定義
ProcessData ビジネス・オブジェクトの定義

以下のリストに、「Case 2 (ケース 2)」リンクに設定された選択条件を記載します。

java.lang.String condition = input1.getString("field1");
if(condition.indexOf("Case2")>=0)
{
	return true;
}
return false;

WebSphere Process Server での実行

  1. 「P06_MultiChoice_gateway」プロセス・インスタンスを開始します。
図 5. 「P06_MultiChoice_gateway」インスタンス
「P06_MultiChoice_gateway」インスタンス
  1. 以下のようにパラメーターを入力します。これで、「Case1 (ケース 1)」と「Case 2 (ケース 2)」が有効になります。
図 6. 入力パラメーター
入力パラメーター
  1. ログを表示して、「Case1 (ケース 1)」、「Case 2 (ケース 2)」、「Case 3 (ケース 3)」のすべてが実行されていることを確認します。
リスト 1. 多重選択のログ
[9/23/10 13:12:47:921 CST] 0000006d SystemOut     O [MultiChoice_gateway]Run into Case2
[9/23/10 13:12:47:921 CST] 0000006d SystemOut     O [MultiChoice_gateway]Run into Case1
[9/23/10 13:12:47:937 CST] 0000006d SystemOut     O [MultiChoice_gateway]Run into Case3, 
                                                      Case3 do not contain a condition.

「多重合成」パターン

「多重合成 (Multi-Merge)」パターンでは、複数の入力ブランチが 1 つのゲートウェイで合成されます。ゲートウェイには 1 つの出力ブランチがあります。いずれかのアクティブな入力ブランチがゲートウェイに達すると、出力ブランチが有効になります。n 個の入力ブランチが有効になる場合、出力ブランチは n 回実行されることになります。

例えば、ある工場が 3 台の機器の購入プロセスを並行して開始するとします。それぞれの機器の購入プロセスが完了して機器が工場に届く度に、後続の機器の保存プロセスが実行されることになります。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

分析

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

  1. プロセスは特定のポイントで複数のブランチに分岐します。
  2. これらの分岐したブランチは同時に実行されます。
  3. すべてのブランチは 1 つのゲートウェイで合成されます。
  4. アクティブなブランチがゲートウェイに達するたびに、ゲートウェイの後に続くアクションが 1 回実行されます。

実装

図 7. 多重合成の実装 – SCA コンポーネント
多重合成の実装 – SCA コンポーネント
図 8. 多重合成の実装 – BPEL 実装
多重合成の実装 – BPEL 実装

上記の図には「Incoming branches (入力ブランチ)」スコープと「Merge gateway (合成ゲートウェイ)」スコープの 2 つがあり、「Merge gateway (合成ゲートウェイ)」スコープには「EventHandler (イベント・ハンドラー)」スコープが定義されています。1 つの出力ブランチは、「EventHandler (イベント・ハンドラー)」スコープ内にあります。

ブランチの通過条件を記録するには、整数型の変数 counter を使用します。counter の初期値は 0 です。1 つの入力ブランチが有効になると、counter が 1 だけインクリメントされます。出力ブランチが 1 回実行されると、counter がら 1 だけデクリメントされます。counter が 0 まで減った時点で、多重合成プロセスは完了します。

「Incoming branches scope (入力ブランチ・スコープ)」では、各入力ブランチの最後に「Invoke (呼び出し)」アクティビティーによって「TestEventHandler (イベント・ハンドラーのテスト)」インターフェースが呼び出されます。これよって、「EventHandler (イベント・ハンドラー)」スコープで「OnEvent (イベント処理)」アクティビティーがトリガーされます。

以下は、「Invoke1 (呼び出し 1)」アクティビティーの終了条件です。counter は 1 だけインクリメントされます。

// @bpe.readWriteVariables names="counter"
System.out.println("[MultiMergeWithHandler]run into invoke2");
counter++;
return false;

「Invoke (呼び出し)」アクティビティーのトランザクションの振る舞いは、「事前コミット (commit before)」または「所有が必要 (requires own)」に設定します。トランザクションの振る舞いについての詳細は、サポート・マニュアル (http://www-01.ibm.com/support/docview.wss?uid=swg21293793) を読んでください。

「EventHandler (イベント・ハンドラー)」スコープでは、出力ブランチに「Case 3 (ケース 3)」を設定します。「Case 3 (ケース 3)」が実行されるたびに、counter が 1 だけデクリメントされます。以下は、「Case 3 (ケース 3)」のコード・スニペットです。

counter--;
System.out.println("[MultiMergeWithHandler]run into Case3, the counter is: " + counter);

「Case1 (ケース 1)」と「Case 2 (ケース 2)」は並行して開始されます。このそれぞれが完了すると、「Case 3 (ケース 3)」が実行されます。つまり、「Case 3 (ケース 3)」は 2 回実行されるということです。

注: ここでは「EventHandler (イベント・ハンドラー)」を使用するため、相関セットを定義する必要があります。

WebSphere Process Server での実行

  1. 「P08_MultiMergeWithHandler」プロセス・インスタンスを開始します。
図 9. 「P08_MultiMergeWithHandler」インスタンス
「P08_MultiMergeWithHandler」インスタンス
  1. 以下のようにパラメーターを入力します。これで、「Case1 (ケース 1)」と「Case 2 (ケース 2)」が有効になります。
図 10. パラメーター
パラメーター
  1. ログを表示して以下の結果を確認します。
    • 「Case1 (ケース 1)」と「Case 2 (ケース 2)」が開始されます。
    • 「Merge gateway (合成ゲートウェイ)」スコープに入ります。
    • 「Case 3 (ケース 3)」が 2 回開始されます。
リスト 2. 多重合成のログ
[9/23/10 13:28:37:328 CST] 0000006d SystemOut     O [MultiMergeWithHandler]run into 
                                                            setCounter
[9/23/10 13:28:37:328 CST] 0000006d SystemOut     O [MultiMergeWithHandler]run into 
                                                            Case1
[9/23/10 13:28:37:328 CST] 0000006d SystemOut     O [MultiMergeWithHandler]run into 
                                                            Case2
[9/23/10 13:28:37:359 CST] 0000006d SystemOut     O [MultiMergeWithHandler]run into 
                                                            invoke1
[9/23/10 13:28:37:484 CST] 0000006d SystemOut     O [MultiMergeWithHandler]run into 
                                                            invoke2
[9/23/10 13:28:37:500 CST] 0000006d SystemOut     O [MultiMergeWithHandler]run into 
                                                            MergeScope
[9/23/10 13:28:38:062 CST] 0000006d SystemOut     O [MultiMergeWithHandler]run into 
                                                            Case3, 
                                                            the counter is: 1
[9/23/10 13:28:38:093 CST] 0000006d SystemOut     O [MultiMergeWithHandler]run into 
                                                            Case3, 
                                                            the counter is: 0

「スレッド分割」パターン

「スレッド分割 (Thread Split)」パターンの分割ポイントには 1 つの出力ブランチしかありませんが、この分割ポイントで特定の数の実行スレッドが開始され、何回も出力ブランチが実行されます。

例えば、教師が 10 人の生徒のために同じ宿題を作成したとすると、生徒の数と同じ 10 の宿題実行インスタンスが開始されます。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

分析

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

  1. 分割ポイントには入力ブランチが 1 つだけあります。
  2. 分割ポイントには出力ブランチが 1 つだけあります。
  3. 分割ポイントで複数のスレッドを作成して、出力ブランチを複数回実行することができます。

実装

図 11. スレッド分割の実装 – SCA コンポーネント
スレッド分割の実装 – SCA コンポーネント
図 12. スレッド分割の実装 – BPC 実装
スレッド分割の実装 – BPC 実装

P42_SplitPoint」プロセスは「ForEach (繰り返し)」構造を使用して、「input1」パラメーターの整数値に応じてスレッドを分割します。スレッドの数は、「StartThread (スレッド開始)」アクティビティーが出力するログに示されます。

図 13. 「P42_SplitPoint」の動作
「P42_SplitPoint」の動作
図 14. 「P42_SplitPoint」ブランチ
「P42_SplitPoint」ブランチ

「P42_OutgoingBranch」プロセスは、すべてのスレッドに対して実行されます。

WebSphere Process Server での実行

  1. BPC エクスプローラーで「P42_SplitPoint」プロセスを開始します。「input1」パラメーターを「3」に設定します。すると、3 つのスレッドが作成されて、そのそれぞれが出力ブランチを実行します。
図 15. 「P42_SplitPoint」プロセス
「P42_SplitPoint」プロセス
  1. ログを表示して、スレッドの分割を確認します。
リスト 3. スレッド分割のログ
[9/23/10 21:33:35:671 CST] 00000084 SystemOut     O [P42_ThredSplit] Start Thread 1
[9/23/10 21:33:37:859 CST] 00000084 SystemOut     O [P42_ThredSplit] Ongoing branch run
[9/23/10 21:33:40:640 CST] 0000006d SystemOut     O [P42_ThredSplit] Start Thread 2
[9/23/10 21:33:43:390 CST] 0000006d SystemOut     O [P42_ThredSplit] Ongoing branch run
[9/23/10 21:33:44:250 CST] 00000130 SystemOut     O [P42_ThredSplit] Start Thread 3
[9/23/10 21:33:46:437 CST] 00000130 SystemOut     O [P42_ThredSplit] Ongoing branch run
[9/23/10 21:33:47:937 CST] 0000006d SystemOut     O [P42_ThredSplit] All threads completed

「スレッド合成」パターン

「スレッド合成 (Thread Merge)」パターンでは、あるプロセス・インスタンスの 1 つのブランチで実行されている特定の数のスレッドが、そのプロセスの指定されたポイントで 1 つの実行スレッドに合成されます。

例えば、教師が 10 人の生徒のために同じ宿題を作成したとすると、生徒の数と同じ 10 の宿題インスタンスが開始されます。宿題が提出されると、教師は宿題の添削を開始します。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

分析

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

  1. 1 つのブランチの多数のインスタンスを作成することができます。
  2. すべてのインスタンスは、あるポイントで合成されます。

実装

図 16. スレッド合成の実装 – SCA コンポーネント
スレッド合成の実装 – SCA コンポーネント
図 17. スレッド合成の実装 – BPC 実装
スレッド合成の実装 – BPC 実装

合成ポイントを実装するには、「WhileLoop (while ループ)」アクティビティーと「Wait (待機)」アクティビティーを使用します。「Invoke (呼び出し)」アクティビティーは外部呼び出しを受け入れて、スレッドを生成します。

整数 nMerge には、スレッド合成を行う特定の数が保存されます。現在合成済みスレッドの数を記録するには、整数 count を使用します。1 つのスレッドが合成されると、count に 1 が加算されます。count と nMerge の値が等しくなると、合成ポイントの「WhileLoop (while ループ)」が有効になり、出力ブランチに設定された「NextAction (次アクション)」が実行可能になります。

WebSphere Process Server での実行

新しい「P41_ThreadMerge」インスタンスを実行します。「nMerge」にはスレッドの合成数を指定します。「processeId」は相関セット・パラメーターです。

図 18. 「P41_ThreadMerge」インスタンス
「P41_ThreadMerge」インスタンス
  1. 「Process Instances (プロセス・インスタンス)」 > 「Started By Me (手動で開始)」へと進みます。
図 19. プロセス・インスタンス
プロセス・インスタンス
  1. 「P41_ThreadMerge」インスタンスをクリックして開きます。
図 20. 「P41_ThreadMerge」インスタンス
「P41_ThreadMerge」インスタンス
  1. 「Waiting Operations (待機処理)」 > 「operation2 (処理 2)」の順にクリックします。
図 21. 待機処理
待機処理
  1. 「processeId」にステップ 1 で入力した値を入力します。
図 22. 「processId」の入力
「processId」の入力
  1. 「Invoke (呼び出し)」を実行依頼します。これにより、1 つのスレッドが作成されます。
  2. ステップ 3 からステップ 6 を繰り返して、残りのスレッドを作成します。
  3. ログを表示して、スレッドの合成を確認します。
リスト 4. スレッド合成のログ
[9/28/10 14:38:30:687 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            Starts
[9/28/10 14:38:31:562 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            Run into wait activity
[9/28/10 14:38:32:515 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            Run into OnEvent
[9/28/10 14:38:32:515 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            count = 0
[9/28/10 14:38:32:531 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            nMerge = 3
[9/28/10 14:38:32:531 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            count = 0
[9/28/10 14:44:40:750 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            Run into OnEvent
[9/28/10 14:44:40:750 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            count = 1
[9/28/10 14:44:40:750 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            Merging one thread
[9/28/10 14:44:40:750 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            nMerge = 3
[9/28/10 14:44:40:750 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            count = 1
[9/28/10 14:45:02:171 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            Run into OnEvent
[9/28/10 14:45:02:171 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            count = 2
[9/28/10 14:45:02:171 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            Merging one thread
[9/28/10 14:45:02:171 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            nMerge = 3
[9/28/10 14:45:02:171 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            count = 2
[9/28/10 14:45:12:281 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            Run into OnEvent
[9/28/10 14:45:12:281 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            count = 3
[9/28/10 14:45:12:281 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            Merging one thread
[9/28/10 14:45:12:281 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            count >= nMerge
[9/28/10 14:45:12:281 CST] 00000076 SystemOut     O [P41_ThreadMerge] 
                                                            Run into NextActivity
[9/28/10 14:45:13:953 CST] 0000004d SystemOut     O [P41_ThreadMerge] 
                                                            Wait over
[9/28/10 14:45:13:953 CST] 0000004d SystemOut     O [P41_ThreadMerge] 
                                                            Reply

「構造化部分結合」パターン

「構造化部分結合 (Structured Partial Join)」パターンでは、複数の入力ブランチ (m 個) が 1 つの合成要素で合成されます。これらの入力ブランチはいずれも、同じ「並列分割 (Parallel Split)」要素から分岐したものです。合成要素には、出力ブランチが 1 つだけあります。この出力ブランチは、入力ブランチのうちの n 個 (n<m) が有効になった時点でトリガーされます。それ以降に有効になった残りの入力ブランチ (m-n) も合成要素に到達しますが、出力ブランチを再度トリガーすることはありません。合成要素は、すべてのアクティブな入力ブランチが有効になった時点でリセットされます。

例えば、3 人のメンバーで構成されている論文審査委員会があるとします。論文がこの委員会に提出されると、各メンバーの審査アクティビティーが有効になります。3 人のメンバーのうち、2 人が審査を終了した時点で、論文発表スケジューリング・アクティビティーを開始できることになっています。最後の審査アクティビティーも最終的には完了しますが、それによって論文発表スケジューリング・アクティビティーが再びトリガーされることはありません。別の論文発表スケジューリング・アクティビティーが有効になるのは、すべての審査アクティビティーが完了してからです。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

分析

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

  1. 最初に 1 つの分岐ポイントから、m 個のブランチが有効にされます。
  2. m 個のブランチは 1 つの合成要素につながっています。
  3. 合成要素には、出力ブランチが 1 つだけあります。
  4. m 個のブランチのうちの n 個 (n<m) が処理を完了して合成要素に達すると、1 つの出力ブランチがトリガーされます。
  5. 残りの m-n 個のブランチが処理を完了して合成要素に達しても、出力ブランチはトリガーされません。
  6. すべてのブランチが処理を完了して合成要素に達すると、合成要素がリセットされます。
  7. リセットされた後、合成要素は再び有効になります。
  8. m と n は、どちらも特定の数値です。

実装

図 23. 構造化部分結合の実装 – SCA コンポーネント
構造化部分結合の実装 – SCA コンポーネント

「P30_StartBranches」を使用して 3 つの入力ブランチを作成します (m=3)。

図 24. P30_StartBranches
P30_StartBranches

「P30_StructPartialJoin」は、m 個の部分合成要素のうちの n 個が合成されると出力ブランチが実行されます (m=3、n=2)。作成されるのは 1 つのインスタンスだけです。

図 25. P30_StructPartialJoin
P30_StructPartialJoin

「WhileLoop (while ループ)」により、この部分合成要素は別の入力ブランチ構造にも再利用することができます。「WhileLoop (while ループ)」が終了するのは、入力パラメーターが文字列「last」となっている場合のみです。

図 26. 「WhileLoop (while ループ)」
「WhileLoop (while ループ)」

処理が完了して合成要素に達した入力ブランチの数を計算するには、整数 counter を使用します。初期値は 0 です。1 つの入力ブランチの処理が完了して合成要素に達すると、counter が 1 だけインクリメントされます。counter は、新しい while ループが開始されるとリセットされます。つまり、すべてのブランチの処理が完了して合成要素に達すると、合成要素はリセットされて再び有効になります。

「ForEach (繰り返し)」ループは、1 つの構造ですべての入力ブランチを受け入れるために使用します。m は 3 であるため、「ForEach (繰り返し)」での繰り返しは 1 から始まって 3 で終わります。

図 27. 「ForEach (繰り返し)」ループ
「ForEach (繰り返し)」ループ

部分合成要素が 1 つの入力ブランチが処理を完了すると、counter が 1 だけインクリメントされます。counter が 2 になると、出力ブランチ「NextAction (次アクション)」がトリガーされます。以下は、「Snippet1 (スニペット 1)」アクティビティーに含まれるコードです。

counter = counter+1;
System.out.println("[P30_StructuredPartialJoin] One Branch Joining. counter=" + counter);

「NextAction (次アクション)」がトリガーされてからも、部分合成要素は残りの 1 つのブランチが処理を完了するまで待機します。すべての入力ブランチが処理を完了した時点で、部分合成要素は次の while ループを開始 (while ループをリセット) し、別の構造に含まれる新しい入力ブランチを待機します。

空の「Outgoing (外部)」アクティビティーは、外部呼び出し、またはサブプロセスに置き換えることができます。

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

WebSphere Process Server での実行

  1. 「P30_StructParrtialJoin」インスタンスを開始します。入力パラメーター「id」は、相関パラメーターです。
図 28. P30_StructParrtialJoin
P30_StructParrtialJoin
  1. 「P30_StartBranches」を開始して、1 つのブランチ構造を開始します。パラメーター「id」は、ステップ 1 の値と同じでなければなりません。
図 29. P30_StartBranches
P30_StartBranches
  1. ログを開いて、部分結合が以下の結果になっていることを確認します。
    • 3 つのブランチが開始されます。
    • 2 つのブランチが合成されます。
    • 出力ブランチ (「NextAction (次アクション)」) がトリガーされます。
    • 最後のブランチが合成されます。
  2. 別の「P30_StartBranches」インスタンスを開始して、別のブランチ構造を作成します。
  3. 入力パラメーター request が last に設定されている場合、部分結合プロセスは完了します。
リスト 5. 構造化部分結合のログ
[9/23/10 22:34:03:140 CST] 0000006d SystemOut     O [P30_StructuredPartialJoin] 
                                                        Branch1 Started
[9/23/10 22:34:03:140 CST] 0000006d SystemOut     O [P30_StructuredPartialJoin] 
                                                        Branch3 Started
[9/23/10 22:34:03:187 CST] 0000006d SystemOut     O [P30_StructuredPartialJoin] 
                                                        Branch2 Started
[9/23/10 22:34:04:859 CST] 0000007b SystemOut     O [P30_StructuredPartialJoin] 
                                                        One Branch Joining. counter=1
[9/23/10 22:34:05:109 CST] 00000090 SystemOut     O [P30_StructuredPartialJoin] 
                                                        Branch3 Finished
[9/23/10 22:34:05:234 CST] 00000084 SystemOut     O [P30_StructuredPartialJoin] 
                                                        One Branch Joining. counter=2
[9/23/10 22:34:05:250 CST] 00000084 SystemOut     O [P30_StructuredPartialJoin] 
                                                        Run to NextAction
[9/23/10 22:34:05:609 CST] 00000078 SystemOut     O [P30_StructuredPartialJoin] 
                                                        Branch1 Finished
[9/23/10 22:34:05:640 CST] 00000084 SystemOut     O [P30_StructuredPartialJoin] 
                                                        One Branch Joining. counter=3
[9/23/10 22:34:05:843 CST] 00000090 SystemOut     O [P30_StructuredPartialJoin] 
                                                        Branch2 Finished

「部分結合のブロック」パターン

「部分結合のブロック (Blocking Partial Join)」パターンは、「構造化部分結合 (Structured Partial Join)」パターンの変形です。唯一異なる点は、ある構造に含まれるすべての入力ブランチが合成されているのでなければ、合成要素がリセットされるまで、他の構造の入力ブランチがブロックされることです。合成要素は、ある構造のアクティブな入力ブランチがすべて有効になった時点でリセットされます。

例えば、「構造化部分結合 (Structured Partial Join)」パターンの例で引用した論文審査委員会が一度に 1 つの論文しか審査の対象にできないとします。現在対象としている論文に対する 3 つすべての審査アクティビティーが完了するまでは、別の論文に対する新しい審査タスクを開始することはできません。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

分析

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

  1. これは、「構造化部分結合 (Structured Partial Join)」パターンの変形です。
  2. 以下の点が異なります。
    • 合成要素がリセットされるのは、1 つのプロセス・インスタンスで特定の構造に含まれるすべてのブランチが有効になった時点です。
    • 合成要素がリセットされるまで、新しいブランチは作成されません。

実装

図 30. 部分結合のブロックの実装 – SCA コンポーネント
部分結合のブロックの実装 – SCA コンポーネント

「P31_StartBranches」インスタンス内では、新たにトリガーが発生したときに、まずブロック・フラグをチェックします。isBlocked フラグが false の場合はブランチを作成し、true の場合には、フラグが false にリセットされるまで待機します。

図 31. 部分結合のブロックの実装 – BPC 実装
部分結合のブロックの実装 – BPC 実装

この実装には、入力パラメーター request が last に設定されるまで新しいトリガーを受け取り続けるために、大規模な while ループがあります。

図 32. while ループ
while ループ

「Block (ブロック)」スコープ内にある while ループには、「Wait (待機)」アクティビティーが含まれています。isBlocked が true の場合、while ループは終了できないため、1 秒後に値を再チェックします。isBlocked が false に変更されるまで、「Block (ブロック)」スコープを出ることはできません。

図 33. isBlocked 条件
isBlocked 条件

isBlocked のリセットを待機するために 1 つの「EventHandler (イベント・ハンドラー)」が定義されています。isBlocked の値が false にリセットされると、ブロックされていた新しいトリガーが「Block (ブロック)」スコープを通過し、新規ブランチが作成されます。

ブロックを通過後、ブランチを作成する前に以下の操作を行います。

  1. isBlocked フラグを true に設定します。この設定により、他のイベント・トリガーが発生しても、ブランチが作成されることはありません。
  2. 現在のブランチ構造に対して「P31_BlockingPartialJoin」インスタンスを開始します。

入力ブランチ「P31_StartBranches」は毎回 3 つの「P31_Branch」インスタンスを作成します。「Wait1 (待機 1)」アクティビティーは、任意のアクティビティー、サブプロセス、ヒューマン・タスクに置き換えられます。

図 34. P31_Branch
P31_Branch

「P30_StarBranches」に含まれるブランチ・グループごとに、「P31_BlockingPartialJoin」(M=3、N=2) インスタンスが作成されます。

図 35. P31_BlockingPartialJoin
P31_BlockingPartialJoin

次に、「ForEach (繰り返し)」ループを使用して 3 つの入力ブランチを受け入れます。

図 36. 「ForEach (繰り返し)」ループ
「ForEach (繰り返し)」ループ

2 番目のブランチが合成されると、出力ブランチ「NextAction (次アクション)」がトリガーされます。これで 3 つのうちの 2 つが合成されたことになります。3 番目のブランチが合成されると、ブロックがリセットされて新規ブランチを作成できるようになります。「resetBlock (ブロックのリセット)」を呼び出すことで「P31_StartBranches」の「EventHandler (イベント・ハンドラー)」がトリガーされ、isBlocked フラグがリセットされます。

WebSphere Process Server での実行

  1. 新しい「P31_StartBranches」インスタンスを開始します。「id」は、相関セット・パラメーターです。
図 37. 新規「P31_StartBranches」インスタンス
新規「P31_StartBranches」インスタンス
  1. 「Process Instances (プロセス・インスタンス)」 > 「Started By Me (手動で開始)」へと進みます。
  2. 「P31_StartBranches」インスタンスをクリックして開きます。
図 38. 「P31_StartBranches」インスタンス
「P31_StartBranches」インスタンス
  1. 「Waiting Operations (待機処理)」 > 「join (合成)」の順にクリックします。
  2. 入力パラメーター request を使用して、ブランチ・グループにマークを付けます。
図 39. 待機処理
待機処理
図 40. 「request」パラメーター
「request」パラメーター
  1. 「Invoke (呼び出し)」を実行依頼します。これにより、「P31_StartBranches」の新規ブランチ構造が作成されます。
  2. ステップ 3 からステップ 5 を繰り返して、別のトリガーを作成します。
図 41. 2 番目の「request」パラメーター
2 番目の「request」パラメーター
  1. ログを開いて、部分結合のブロックが以下の結果になっていることを確認します。
    • 「request1」 の結果 (黒の部分)
      • 「request1」に対するトリガーが発生します。
      • isBlocked フラグにデフォルトで設定された false が true に変更されます。
      • 「request1」の 3 つのブランチが作成されます。
      • 2 つのブランチが合成されます。
      • 「NextAction (次アクション)」が呼び出されます。
      • 最後のブランチが合成されます。
      • 部分結合が完了し、isBlocked フラグが false にリセットされます。
    • 「request2」の結果 (青の部分)
      • 「request2」に対するトリガーが発生します。
      • 「request1」の部分結合がリセットされていないため、isBlocked フラグは true に設定され、「request2」は待機状態になります。
      • 「request1」の部分結合が完了し、isBlocked フラグが false にリセットされます。
      • 「request2」がブロックを通過し、isBlocked フラグが true に変更されます。
      • 「request2」の 3 つのブランチが作成されます。
      • 「request2」の 2 つのブランチが合成されます。
      • 「NextAction (次アクション)」が呼び出されます。
      • 「request2」の最後のブランチが合成されます。
      • 「request2」の部分結合が完了し、isBlocked フラグが false にリセットされます。
リスト 6. 部分結合のブロックのログ
[9/24/10 21:51:22:312 CST] 0000006b SystemOut     O [P31_BlockingPartialJoin] 
                                                    New trigger for request1
[9/24/10 21:51:22:406 CST] 0000006b SystemOut     O [P31_BlockingPartialJoin] 
                                                    Set block flag to true in request1
[9/24/10 21:51:23:109 CST] 000001f9 SystemOut     O [P31_BlockingPartialJoin] 
                                                    Branch1 started in request1
[9/24/10 21:51:23:328 CST] 000001f9 SystemOut     O [P31_BlockingPartialJoin] 
                                                    Branch3 started in request1
[9/24/10 21:51:23:796 CST] 000001f9 SystemOut     O [P31_BlockingPartialJoin] 
                                                    Branch2 started in request1
[9/24/10 21:51:38:031 CST] 00000066 SystemOut     O [P31_BlockingPartialJoin] 
                                                    New trigger for request2
[9/24/10 21:51:38:125 CST] 00000066 SystemOut     O [P31_BlockingPartialJoin] 
                                                    Block flag is true. Waiting.. 
                                                            in   request2
[9/24/10 21:51:39:796 CST] 0000006b SystemOut     O [P31_BlockingPartialJoin] 
                                                    One Branch Joined in request1
[9/24/10 21:51:40:750 CST] 0000006a SystemOut     O [P31_BlockingPartialJoin] 
                                                    One Branch Joined in request1
[9/24/10 21:51:41:578 CST] 00000045 SystemOut     O [P31_BlockingPartialJoin] 
                                                    Block flag is true. Waiting.. 
                                                            in   request2
[9/24/10 21:51:42:302 CST] 00000070 SystemOut     O [P31_BlockingPartialJoin] 
                                                    Next Action Started 
[9/24/10 21:51:42:328 CST] 00000236 SystemOut     O [P31_BlockingPartialJoin] 
                                                    One Branch Joined in request1
[9/24/10 21:51:42:343 CST] 00000070 SystemOut     O [P31_BlockingPartialJoin] 
                                                    PartialJoin finished, reset Block 
                                                            in request1

[9/24/10 21:51:42:640 CST] 000001ff SystemOut     O [P31_BlockingPartialJoin] 
                                                    Set block flag to true in request2
[9/24/10 21:51:43:375 CST] 000002d0 SystemOut     O [P31_BlockingPartialJoin] 
                                                    Branch1 started in request2
[9/24/10 21:51:43:437 CST] 000002d0 SystemOut     O [P31_BlockingPartialJoin] 
                                                    Branch3 started in request2
[9/24/10 21:51:43:515 CST] 000002d0 SystemOut     O [P31_BlockingPartialJoin] 
                                                    Branch2 started in request2
[9/24/10 21:51:58:937 CST] 0000006a SystemOut     O [P31_BlockingPartialJoin] 
                                                    One Branch Joined in request2
[9/24/10 21:51:59:046 CST] 00000235 SystemOut     O [P31_BlockingPartialJoin] 
                                                    One Branch Joined in request2
[9/24/10 21:51:59:140 CST] 00000236 SystemOut     O [P31_BlockingPartialJoin] 
                                                    Next Action Started
[9/24/10 21:51:59:250 CST] 00000069 SystemOut     O [P31_BlockingPartialJoin] 
                                                    One Branch Joined in request2 
[9/24/10 21:51:59:359 CST] 00000235 SystemOut     O [P31_BlockingPartialJoin] 
                                                    PartialJoin finished, reset Block 
                                                             in request2

「部分結合のキャンセル」パターン

「部分結合のキャンセル (Cancelling Partial Join)」パターンは、「構造化部分結合 (Structured Partial Join)」パターンの変形です。唯一異なる点は、合成要素の m 個の入力ブランチのうち n 個が処理を完了して合成要素に達すると、残りの m-n 個の入力ブランチの実行がキャンセルされ、それと同時に合成要素がリセットされることです。

論文審査委員会の例で言うと、2 人のメンバーが審査アクティビティーを終えた時点で、論文の論文発表スケジューリング・アクティビティーを開始し、もう 1 人の審査アクティビティーをキャンセルすることができます。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

分析

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

  1. これは、「構造化部分結合 (Structured Partial Join)」パターンの変形です。
  2. 残りの m-n 個のブランチの処理は、完了せずにキャンセルされます。
図 42. 部分結合のキャンセルの実装
部分結合のキャンセルの実装

「P32_StartBranch」を使用してブランチ (m=3) を作成します。部分結合が完了すると、その通知を受け取った「EventHandler (イベント・ハンドラー)」が CancelFault をスローして、残りのブランチをキャンセルします。

図 43. P32_StartBranch
P32_StartBranch

2 のブランチが合成された後は、以下の操作が行われます。

  1. 「P32_StartBranch」プロセスに通知が送信され、残りのブランチがキャンセルされます。
  2. 出力ブランチ「NextAction (次アクション)」がトリガーされます。空の「Outgoing (出力)」アクティビティーは、他の外部呼び出し、またはサブプロセスに置き換えることができます。
図 44. 出力ブランチ
出力ブランチ

WebSphere Process Server での実行

  1. 「P32_CancelPartialJoin」インスタンスを開始します。入力パラメーター「id」は相関パラメーターです。
図 45. P32_CancelPartialJoin
P32_CancelPartialJoin
  1. 「P32_StartBranch」を開始します。「id」の値は、ステップ 1 の値と同じでなければなりません。
図 46. P32_StartBranch
P32_StartBranch
  1. ログを開いて、部分結合が以下の結果になっていることを確認します。
    • 3 つのブランチが開始されます。
    • 「Branch2」が合成されます。
    • 「Branch2」が終了します。
    • 「Branch1」が合成されます。
    • 「Branch1」が完了します。
    • 「P32_StartBranch」が部分結合の完了通知を受け取ります。
    • 出力ブランチ「NextAction (次アクション)」がトリガーされます。
    • 残りのブランチがキャンセルされます。
リスト 7. 部分結合のキャンセルのログ
[9/9/10 15:25:29:093 CST] 000000b9 SystemOut     O [P32_CancellingPartialJoin] 
                                                    Branch1 Started
[9/9/10 15:25:29:093 CST] 000000b9 SystemOut     O [P32_CancellingPartialJoin] 
                                                    Branch3 Started
[9/9/10 15:25:29:093 CST] 000000b9 SystemOut     O [P32_CancellingPartialJoin] 
                                                    Branch2 Started
[9/9/10 15:25:31:406 CST] 000000b9 SystemOut     O [P32_CancellingPartialJoin] 
                                                    One Branch Joined
[9/9/10 15:25:31:531 CST] 00000225 SystemOut     O [P32_CancellingPartialJoin] 
                                                    Branch2 Finished
[9/9/10 15:25:32:187 CST] 00000067 SystemOut     O [P32_CancellingPartialJoin] 
                                                    One Branch Joined
[9/9/10 15:25:32:234 CST] 00000287 SystemOut     O [P32_CancellingPartialJoin] 
                                                    Branch1 Finished
[9/9/10 15:25:32:312 CST] 00000225 SystemOut     O [P32_CancellingPartialJoin] 
                                                    Get Partial Join Completed Event
[9/9/10 15:25:32:687 CST] 00000064 SystemOut     O [P32_CancellingPartialJoin] 
                                                    Next Action Started
[9/9/10 15:25:33:671 CST] 00000225 SystemOut     O [P32_CancellingPartialJoin] 
                                                    Cancel left branches

「構造化弁別」パターン

「構造化弁別 (Structured Discriminator)」パターンは、「構造化部分結合 (Structured Partial Join)」パターンの変形で、唯一異なる点は、最初の入力ブランチが合成された時点で出力ブランチがトリガーされることです。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

実装

「P30_StructPartialJoin」出力ブランチのトリガー条件を counter==1 に変更します。

図 47. 構造化弁別の実装
構造化弁別の実装

WebSphere Process Server での実行

「構造化部分結合 (Structured Partial Join)」パターンを実行する場合と同様です。

  1. まず、「P9_StructDiscrim」インスタンスを開始します。
  2. 次に、「P9_StartBranches」インスタンスを開始します。
リスト 8. 構造化弁別のログ
[9/26/10 15:43:22:453 CST] 000000b5 SystemOut     O [P9_StructuredDiscriminator] 
                                                    Branch1 Started
[9/26/10 15:43:22:453 CST] 000000b5 SystemOut     O [P9_StructuredDiscriminator] 
                                                    Branch3 Started
[9/26/10 15:43:22:453 CST] 000000b5 SystemOut     O [P9_StructuredDiscriminator] 
                                                    Branch2 Started
[9/26/10 15:43:23:312 CST] 000000ab SystemOut     O [P9_StructuredDiscriminator] 
                                                    One Branch Joining. counter=1
[9/26/10 15:43:23:359 CST] 000000ab SystemOut     O [P9_StructuredDiscriminator] 
                                                    Run to NextAction
[9/26/10 15:43:23:593 CST] 000000ad SystemOut     O [P9_StructuredDiscriminator] 
                                                    Branch1 Finished
[9/26/10 15:43:24:687 CST] 000000b9 SystemOut     O [P9_StructuredDiscriminator] 
                                                    One Branch Joining. counter=2
[9/26/10 15:43:24:812 CST] 0000000b SystemOut     O [P9_StructuredDiscriminator] 
                                                    Branch2 Finished
[9/26/10 15:43:25:109 CST] 000000b1 SystemOut     O [P9_StructuredDiscriminator] 
                                                    One Branch Joining. counter=3

「弁別のブロック」パターン

「弁別のブロック (Blocking Discriminator)」パターンは、「部分結合のブロック (Blocking Partial Join)」パターンの変形です。唯一異なる点は、このパターンでは、最初の入力ブランチが合成された時点で出力ブランチがトリガーされることです。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

実装

「P31_BlockPartialJoin」を少し変更して、最初のブランチの処理が完了して合成要素に到達した時点で出力ブランチがトリガーされるようにします。

図 48. 弁別のブロックの実装 1
弁別のブロックの実装 1

WebSphere Process Server での実行

  1. 新しい「P28_StartBranches」インスタンスを開始します。
  2. 合成処理を 2 回トリガーします。
リスト 9. 弁別のブロックのログ
[9/26/10 16:55:02:187 CST] 00000210 SystemOut     O [P28_BlockingDiscriminator] 
                                                    New trigger for request1
[9/26/10 16:55:02:281 CST] 00000210 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Set block flag to true in request1
[9/26/10 16:55:02:578 CST] 000000b1 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Branch1 started in request1
[9/26/10 16:55:02:687 CST] 000000b1 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Branch3 started in request1
[9/26/10 16:55:02:828 CST] 000000b1 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Branch2 started in request1
[9/26/10 16:55:11:421 CST] 00000210 SystemOut     O [P28_BlockingDiscriminator] 
                                                    New trigger for request2
[9/26/10 16:55:11:468 CST] 00000210 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Block flag is true. Waiting....  
                                                                in request2
[9/26/10 16:55:16:125 CST] 000000b3 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Block flag is true. Waiting....  
                                                                in request2
[9/26/10 16:55:17:500 CST] 00000047 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Block flag is true. Waiting....  
                                                                in request2
[9/26/10 16:55:19:234 CST] 0000000b SystemOut     O [P28_BlockingDiscriminator] 
                                                    One Branch Joined in request1
[9/26/10 16:55:19:953 CST] 000000b3 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Block flag is true. Waiting....  
                                                                in request2
[9/26/10 16:55:20:437 CST] 000000b5 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Next Action Started
[9/26/10 16:55:20:453 CST] 000000b4 SystemOut     O [P28_BlockingDiscriminator] 
                                                    One Branch Joined in request1
[9/26/10 16:55:21:250 CST] 000000b4 SystemOut     O [P28_BlockingDiscriminator] 
                                                    One Branch Joined in request1
[9/26/10 16:55:21:531 CST] 000000b4 SystemOut     O [P28_BlockingDiscriminator] 
                                                    PartialJoin finished, 
                                                    reset Block in request1
[9/26/10 16:55:22:921 CST] 00000046 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Set block flag to true in request2
[9/26/10 16:55:23:359 CST] 00000241 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Branch1 started in request2
[9/26/10 16:55:23:562 CST] 00000241 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Branch3 started in request2
[9/26/10 16:55:23:718 CST] 00000241 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Branch2 started in request2
[9/26/10 16:55:39:796 CST] 0000000b SystemOut     O [P28_BlockingDiscriminator] 
                                                    One Branch Joined in request2
[9/26/10 16:55:39:937 CST] 000000b5 SystemOut     O [P28_BlockingDiscriminator] 
                                                    Next Action Started
[9/26/10 16:55:40:062 CST] 000000b9 SystemOut     O [P28_BlockingDiscriminator]     
                                                    One Branch Joined in request2
[9/26/10 16:55:40:625 CST] 0000000b SystemOut     O [P28_BlockingDiscriminator] 
                                                    One Branch Joined in request2
[9/26/10 16:55:40:625 CST] 0000000b SystemOut     O [P28_BlockingDiscriminator] 
                                                    PartialJoin finished, 
                                                    reset Block in request2

ソリューション 2

図 49. 弁別のブロックの実装 2
弁別のブロックの実装 2
図 50. BPEL 実装
BPEL 実装

「Task1 (タスク 1)」が最初に完了した場合は「Invoke1 (呼び出し 1)」が実行され、それによって「EventHandler (イベント・ハンドラー)」がトリガーされます。そうでない場合は、「Task1 (タスク 1)」ブランチが「CompleteAll (全完了)」に合成され、「Task2 (タスク 2)」ブランチの「Invoke2 (呼び出し 2)」が「EventHandler (イベント・ハンドラー)」をトリガーします。

「EventHandler (イベント・ハンドラー)」がトリガーされるということは、1 つのブランチが完了し、それによって「Task3 (タスク 3)」(出力ブランチ) が開始されるということです。「WhileLoop (while ループ)」は「CompleteAll (全完了)」アクティビティーが完了するまで待機します。「CompleteAll (全完了)」アクティビティーが完了した場合、それはすべてのブランチが完了したことを意味するため、エラーがスローされて、ブロックがリセットされます。

以下のリストに、「Reset Blocker (ブロッカーのリセット)」のコード・スニペットを記載します。

System.out.println("[Blocking Discriminator] Reset Blocker");
Service sm = (Service)ServiceManager.INSTANCE.locateService("BusiBlockReqInfPartner");
Boolean block = (Boolean)((DataObject)(sm.invoke("getBlocking",""))).get(0);
System.out.println("[Blocking Discriminator] Block?" + block.booleanValue());
sm.invoke("setBlocking",!block.booleanValue());
block = (Boolean)((DataObject)(sm.invoke("getBlocking",""))).get(0);
System.out.println("[Blocking Discriminator] After reset Block?" + block.booleanValue());

以下は、「Blocking POJO (POJO のブロック)」での SCA 実装のリストです。

public void setBlocking(Boolean input) {
	blocking = input.booleanValue();
}
public Boolean getBlocking(String value) {
	return blocking;
}
public DataObject request(DataObject input) {
	System.out.println("[Blocking Discriminator] Run into Blocking, block?" 
                                                     + blocking);
	try {
		if (blocking) {
			do{
				System.out.println("[Blocking Discriminator] Waiting in 
                                                    Blocking as Blocked");
				Thread.sleep(5000);
			} while (blocking);
			System.out.println("[Blocking Discriminator] Continue as 
                                                    Unblocked Now");
		}
	} catch (Exception e) {
		System.out.println("[Blocking Discriminator] Run into Error");
		e.printStackTrace();
	} finally {
		System.out.println("[Blocking Discriminator] Start invoke");
		locateService_BusiReqInfPartner().invokeAsync("request", input);
		blocking = true;
	}
		return null;
}

注: 多数の入力ブランチがある場合、ソリューション 2 を使用するのは簡単ではありません。ブランチの数が増えると、リンクが大幅に増えるためです。

WebSphere Process Server での実行

  1. WID で、「P28_Blocking」を右クリックして「Test Component (コンポーネントのテスト)」を選択します。
  2. 以下に示す入力パラメーターを使用して、「request」処理をテストするための新規「Invoke (呼び出し)」アクティビティーを作成します。
図 51. プロパティーの詳細
プロパティーの詳細
  1. 「request」処理をテストするためのもう 1 つの「Invoke (呼び出し)」アクティビティーには、異なる「id」値を使用します (この「Invoke (呼び出し)」アクティビティーは、最初の呼び出しでのすべてのブランチが終了するまでブロックされることになります)。
図 52. 「Invoke (呼び出し)」アクティビティー
「Invoke (呼び出し)」アクティビティー
  1. BPC エクスプローラーを開いて、「My To-do」を表示します。最初の呼び出しによって、2 つのヒューマン・タスクが作成されているはずです。
図 53. To-do リスト
To-do リスト
  1. 「Task1 (タスク 1)」を処理して、このタスクを完了します。
  2. 「Task2 (タスク 2)」を処理して、このタスクを完了します。
  3. 最初の呼び出しが完了してブロックがリセットされると、2 番目の呼び出しが引き続き実行されます。
  4. BPC エクスプローラーで「My To-do」を表示します。2 番目の呼び出しによって 2 つのヒューマン・タスクが作成されているはずです。
  5. この 2 つのタスクを完了します。
  6. ログを表示して、弁別のブロックの結果を確認します。
    • 最初の呼び出しでは block の値が false であるため、呼び出しを実行することができます。
    • 2 番目の呼び出しでは block の値が true であるため、呼び出しがブロックされます。
    • 「Task1 (タスク 1)」が完了すると、「Task3 (タスク 3)」が開始されます (出力ブランチ)
    • 「Task2 (タスク 2)」が完了すると、block の値が false にリセットされます。
    • 2 番目の呼び出しが続行されます。
リスト 10. 弁別のブロックのログ
[9/28/10 18:06:55:296 GMT+08:00] 00000388 SystemOut  O [Blocking Discriminator] 
                                                        Run into Blocking, 
                                                        block?false        
[9/28/10 18:06:55:296 GMT+08:00] 00000388 SystemOut  O [Blocking Discriminator] 
                                                        Start invoke
[9/28/10 18:07:01:656 GMT+08:00] 00000054 SystemOut  O [Blocking Discriminator] 
                                                        Run into Initiate  
[9/28/10 18:07:05:968 GMT+08:00] 00000050 SystemOut  O [Blocking Discriminator] 
                                                        Run into Blocking, 
                                                        block?true         
[9/28/10 18:07:05:968 GMT+08:00] 00000050 SystemOut  O [Blocking Discriminator] 
                                                        Waiting in Blocking 
                                                        as Blocked        
[9/28/10 18:07:35:968 GMT+08:00] 00000050 SystemOut  O [Blocking Discriminator] 
                                                        Waiting in Blocking 
                                                        as Blocked        
[9/28/10 18:07:38:687 GMT+08:00] 0000039b SystemOut  O [Blocking Discriminator] 
                                                        Task1 Completed       
[9/28/10 18:07:38:906 GMT+08:00] 000003ac SystemOut  O [Blocking Discriminator] 
                                                        Run into Task3    
[9/28/10 18:07:40:968 GMT+08:00] 00000050 SystemOut  O [Blocking Discriminator] 
                                                        Waiting in Blocking 
                                                        as Blocked        
[9/28/10 18:07:45:968 GMT+08:00] 00000050 SystemOut  O [Blocking Discriminator] 
                                                        Waiting in Blocking 
                                                        as Blocked        
[9/28/10 18:07:47:140 GMT+08:00] 0000039d SystemOut  O [Blocking Discriminator] 
                                                        Task2 Completed        
[9/28/10 18:07:47:140 GMT+08:00] 0000039d SystemOut  O [Blocking Discriminator] 
                                                        Completed ALL.     
[9/28/10 18:07:50:968 GMT+08:00] 00000050 SystemOut  O [Blocking Discriminator] 
                                                        Waiting in Blocking 
                                                        as Blocked       
[9/28/10 18:07:52:296 GMT+08:00] 000003ac SystemOut  O [Blocking Discriminator] 
                                                        Reset Blocker       
[9/28/10 18:07:55:968 GMT+08:00] 00000050 SystemOut  O [Blocking Discriminator] 
                                                        Continue as Unblocked Now
[9/28/10 18:07:55:968 GMT+08:00] 00000050 SystemOut  O [Blocking Discriminator] 
                                                        Start invoke     
[9/28/10 18:07:57:453 GMT+08:00] 00000051 SystemOut  O [Blocking Discriminator] 
                                                        Waiting in Blocking 
                                                        as Blocked        
[9/28/10 18:08:01:437 GMT+08:00] 00000054 SystemOut  O [Blocking Discriminator] 
                                                        Run into Initiate 
[9/28/10 18:08:01:968 GMT+08:00] 00000053 SystemOut  O [Blocking Discriminator] 
                                                        Waiting in Blocking 
                                                        as Blocked        
[9/28/10 18:08:27:015 GMT+08:00] 00000050 SystemOut  O [Blocking Discriminator] 
                                                        Task2 Completed   
[9/28/10 18:08:28:718 GMT+08:00] 000003ac SystemOut  O [Blocking Discriminator] 
                                                        Run into Task3 
[9/28/10 18:08:36:203 GMT+08:00] 0000039c SystemOut  O [Blocking Discriminator] 
                                                        Task1 Completed   
[9/28/10 18:08:36:203 GMT+08:00] 0000039c SystemOut  O [Blocking Discriminator] 
                                                        Completed ALL.   
[9/28/10 18:08:41:843 GMT+08:00] 00000054 SystemOut  O [Blocking Discriminator] 
                                                        Reset Blocker

「弁別のキャンセル」パターン

「弁別のキャンセル (Cancelling Discriminator)」パターンは、「部分結合のキャンセル (Cancelling Partial Join)」パターンと同様です。唯一異なる点は、このパターンでは最初の入力ブランチが合成された時点で出力ブランチがトリガーされ、残りのブランチがキャンセルされることです。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

実装

「P32_CancelPartialJoin」を少し変更します。ただし、「P32_CancelPartialJoin」の「Receive (受信)」スコープを 1 つだけ維持してください。

図 54. 弁別のキャンセルの実装 1
弁別のキャンセルの実装 1

WebSphere Process Server での実行

  1. 「P29_CancelDiscrim」インスタンスを開始します。
  2. 「P29_StartBranch」を開始します。
リスト 11. 弁別のキャンセル 1 のログ
[9/26/10 17:30:37:968 CST] 000000a8 SystemOut     O [P29_CancellingDiscriminator] 
                                                        Branch1 Started
[9/26/10 17:30:37:968 CST] 000000a8 SystemOut     O [P29_CancellingDiscriminator] 
                                                        Branch3 Started
[9/26/10 17:30:37:968 CST] 000000a8 SystemOut     O [P29_CancellingDiscriminator] 
                                                        Branch2 Started
[9/26/10 17:30:40:593 CST] 000000b1 SystemOut     O [P29_CancellingDiscriminator] 
                                                        One Branch Joined
[9/26/10 17:30:40:718 CST] 000000b4 SystemOut     O [P29_CancellingDiscriminator] 
                                                        Next Action Started
[9/26/10 17:30:40:718 CST] 000000a8 SystemOut     O [P29_CancellingDiscriminator] 
                                                        Branch2 Finished
[9/26/10 17:30:40:781 CST] 000000a8 SystemOut     O [P29_CancellingDiscriminator] 
                                                        Get Partial Join Completed Event
[9/26/10 17:30:41:609 CST] 000000a8 SystemOut     O [P29_CancellingDiscriminator] 
                                                        Cancel left branches

「一般的 AND 結合」パターン

「一般的 AND 結合 (Generalized AND-Join)」パターンは、複数の入力ブランチを 1 つの合成要素で合成できるようにします。合成要素には、出力ブランチが 1 つだけあります。合成要素が出力ブランチをトリガーするのは、同じインスタンスのすべての入力ブランチが処理を完了して合成要素に到達した場合のみです。他のブランチについては、受信した後、将来のトリガーに備えてそのまま保持しておくことができます。

例えば自動車製造工場では、さまざまな生産ラインからエンジン、シャーシ、ボディーのコンポーネントが集められます。自動車 1 台分のすべてのコンポーネントを受け取った時点で、各コンポーネントを使って自動車を組み立てます。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

分析

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

  1. 合成要素には、複数の入力ブランチと 1 つの出力ブランチがあります。
  2. さまざまなインスタンスからの入力ブランチは任意の時点で処理を完了して合成要素に到達します。その順序は決まっていません。
  3. 合成要素が出力ブランチをトリガーするのは、1 つのインスタンスの入力ブランチがすべて合成された時点です。

実装

図 55. 一般的 AND 結合の実装 – SCA コンポーネント
一般的 AND 結合の実装 – SCA コンポーネント

「P33_StartBranches」インスタンスを使用して入力ブランチを生成します。各インスタンスが生成する入力ブランチは 3 つです。それぞれのブランチが、製品の構成パーツ 1 つの生成をシミュレートします。1 つの製品には 3 つのパーツがあります。各ブランチの最後で、「Join_Invoke (合成呼び出し)」アクティビティーを使って「P33_ANDJoin」に結合します。

図 56. P33_StartBranches
P33_StartBranches

「Wait (待機)」アクティビティーは遅延を発生させるために使用します。このアクティビティーは、任意のサブプロセスまたはヒューマン・タスクに置き換えられます。ここでは、待機時間を乱数で設定します。

図 57. 「Wait (待機)」アクティビティー
「Wait (待機)」アクティビティー

すべての「Join_Invoke (合成呼び出し)」に共通する合成インターフェースの定義は以下のとおりです。

  • 「request」を使用してそれぞれに異なるインスタンスをマークします。
  • 「part」を使用してそれぞれに異なるブランチをマークします。
  • 「id」は、相関セット・パラメーターです。
図 58. 「Join_Invoke (合成呼び出し)」
「Join_Invoke (合成呼び出し)」

「P33_ANDJoin」にはインスタンスが 1 つだけあり、このインスタンスが「P33_StartBranches」インスタンスから生成されたすべての入力ブランチを受信します。「P33_StartBranches」インスタンスごとに生成された 3 つのパーツすべてが合成されると、製品が組み立てられて、次のアクションをトリガーできるようになります。

図 59. 「P33_ANDJoin」ブランチ
「P33_ANDJoin」ブランチ

処理を完了して合成要素に到達したすべてのパーツを保存するために 3 つのリストがあります。この Part1List、Part2List、Part3List の型はすべて RequestList です。

図 60. RequestList
RequestList

「WhileLoop (while ループ)」は、すべての入力ブランチを継続的に受信するために使用され、request が last になるとループは終了します。

図 61. WhileLoop
WhileLoop

「ClassifyChoice (選択パーツの分類)」は到着したすべてのパーツを分類し、タイプごとのリストに追加します。1 つのパーツが到着するごとに、入力パラメーター part に応じたリストに追加します。

図 62. 「Part1 (パーツ 1)」の選択条件
「Part1 (パーツ 1)」の選択条件

part1 リクエストを part1List に追加するには、「AddPart1 (パーツ 1 の追加)」スニペットを使用します。他の「AddPart (パーツの追加)」アクティビティーも同様です。

図 63. part1List リクエスト
part1List リクエスト

「AssemblyChoice (選択パーツの組み立て)」は、1 つのリクエストのすべてのパーツが到着したかどうかをチェックするために使用します。すべてのパーツが到着している場合には、それらのパーツが製品に組み立てられて、出力ブランチ (「NextAction (次アクション)」) がトリガーされます。

「AllPart (全パーツ)」の選択条件は以下のとおりです (すべてのパーツ・リストに共通する request があること)。

図 64. 「AllPart (全パーツ)」の選択条件
「AllPart (全パーツ)」の選択条件

3 つすべてのパーツ・リストにこの request が含まれている場合、それは、この request のすべてのパーツが到着したことを意味します。したがって、製品を組み立て、出力ブランチをトリガーすることができます。1 つの製品が組み立てられた後にパーツ・リストを消去するには、remove スニペットを使用します。

WebSphere Process Server での実行

実行手順は以下のとおりです。

  1. 「P33_ANDJoin」プロセスのシングルトン・インスタンスを開始します。「id」は相関セット・パラメーターです。したがって、ブランチ内のすべての合成には何らかの「id」値があります。
図 65. 「P33_ANDJoin」プロセスの開始
「P33_ANDJoin」プロセスの開始
  1. 1 つの「P33_StartBranches」インスタンスを開始します。「id」の値は、「P33_ANDJoin」インスタンスでの値と同じでなければなりません。
図 66. P33_StartBranches
P33_StartBranches
  1. 他の 2 つの「P33_StartBranches」インスタンスを開始します。
図 67. 2 つの P33_StartBranches
2 つの P33_StartBranches
  1. これで、それぞれに異なる入力パラメーター request が設定された 3 つの「P33_StartBranches」インスタンスが作成されました。ここで、ログ・ファイルで「GeneralizedAndJoin」を確認します。
    • 黒の部分は、最初の「P33_StartBranches」インスタンスによってトリガーされた出力ログです。
    • 青の部分は、2 番目の「P33_StartBranches」インスタンスによってトリガーされた出力ログです。
    • 赤の部分は、3 番目の「P33_StartBranches」インスタンスによってトリガーされた出力ログです。
    • 合成要素は最初に「request1」インスタンスのすべての入力ブランチを受け取った後、出力ブランチをトリガーします。次に「request3」ブランチが組み立てられ、最後に「request2」ブランチが組み立てられます。
リスト 12. 一般的 AND 結合のログ
[9/26/10 12:27:52:484 CST] 000000b5 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    request1 part2 wait 17
[9/26/10 12:27:52:500 CST] 000000b5 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    request1 part3 wait 13
[9/26/10 12:27:52:500 CST] 000000b5 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    request1 part1 wait 2
[9/26/10 12:27:54:859 CST] 00000009 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    Get part1 of request1
[9/26/10 12:28:00:203 CST] 000000a8 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    request2 part2 wait 60
[9/26/10 12:28:00:203 CST] 000000a8 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    request2 part3 wait 3
[9/26/10 12:28:00:218 CST] 000000a8 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    request2 part1 wait 10
[9/26/10 12:28:03:609 CST] 000000ab SystemOut     O [P33_GeneralizedANDJoin] 
                                                    Get part3 of request2
[9/26/10 12:28:05:937 CST] 00000008 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    Get part3 of request1
[9/26/10 12:28:08:796 CST] 000000b1 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    request3 part2 wait 42
[9/26/10 12:28:08:812 CST] 000000b1 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    request3 part3 wait 1
[9/26/10 12:28:08:812 CST] 000000b1 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    request3 part1 wait 8
[9/26/10 12:28:09:656 CST] 00000009 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    Get part2 of request1
[9/26/10 12:28:09:671 CST] 00000009 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    NextAction - Assembly in request1
[9/26/10 12:28:10:500 CST] 00000008 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    Get part3 of request3
[9/26/10 12:28:11:500 CST] 00000009 SystemOut     O [P33_GeneralizedANDJoin] 
                                                    Get part1 of request2
[9/26/10 12:28:17:718 CST] 0000000b SystemOut     O [P33_GeneralizedANDJoin] 
                                                    Get part1 of request3
[9/26/10 12:28:51:000 CST] 000000ad SystemOut     O [P33_GeneralizedANDJoin] 
                                                    Get part2 of request3
[9/26/10 12:28:51:000 CST] 000000ad SystemOut     O [P33_GeneralizedANDJoin] 
                                                    NextAction - Assembly in request3
[9/26/10 12:29:00:562 CST] 000000ab SystemOut     O [P33_GeneralizedANDJoin] 
                                                    Get part2 of request2
[9/26/10 12:29:00:562 CST] 000000ab SystemOut     O [P33_GeneralizedANDJoin] 
                                                    NextAction - Assembly in request2

「構造化同期合成」パターン

「構造化同期合成 (Structured Synchronizing Merge)」パターンでは、同じ構造の特定のポイントから分岐した複数の入力ブランチが 1 つの合成ポイントで合成されます。アクティブな入力ブランチがすべて到達した場合にのみ、合成ポイントを通過することができます。

例えば、生産規模の拡大プロセスには、工場の状況に応じてスタッフの採用および機器の購入タスクが組み込まれるとします。これらのタスクは同時に開始されます。2 つのタスクの両方が完了した時点で生産規模の拡大プロセスが完了し、新しい生産を開始することができます。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

分析

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

  1. プロセスは特定のポイントで複数のブランチに分岐します。
  2. これらの分岐したブランチは同時に実行されます。
  3. すべてのブランチは 1 つの合成ポイントで合成されます。
  4. すべてのアクティブなブランチが合成ポイントに到達してからでないと、後続のアクションは有効になりません。

実装

図 68. 構造化同期合成の実装 – SCA コンポーネント
構造化同期合成の実装 – SCA コンポーネント
図 69. 構造化同期合成の実装 – BPC 実装
構造化同期合成の実装 – BPC 実装

「Wait4case1 (ケース 1 を待機)」と「Wait4case2 (ケース 2 を待機)」がどちらも有効になっている場合、「Case1 (ケース 1)」ブランチと「Case2 (ケース 2)」ブランチの両方が完了した後に「SyncSnippet (同期スニペット)」アクティビティーが開始されます。

WebSphere Process Server での実行

  1. 「P07_StructuredSynchronizingMerge」プロセス・インスタンスを開始します。
図 70. P07_StructuredSynchronizingMerge
P07_StructuredSynchronizingMerge
  1. 以下のようにパラメーターを入力します。これで、「Case1 (ケース 1)」と「Case2 (ケース 2)」が有効になります。「Case1 (ケース 1)」は 2 秒間待機し、「Case2 (ケース 2)」は 5 秒間待機します。
図 71. 入力パラメーター
入力パラメーター
  1. ログを表示して、「Case1 (ケース 1)」が開始されたことを確認します。その 3 秒後に「Case2 (ケース 2)」が開始されます。「SyncSnippet (同期スニペット)」は、「Case1 (ケース 1)」と「Case2 (ケース 2)」の後に開始されているはずです。
リスト 13. 合成同期合成のログ
[9/23/10 13:18:44:390 CST] 00000046 SystemOut     O [Snippet4Case1]After wait: 
                                                    2, runinto the Snippet4Case1
[9/23/10 13:18:44:390 CST] 00000046 SystemOut     O [Snippet4Case1]The orginial 
                                                    string is: Case1Case2
[9/23/10 13:18:47:359 CST] 00000046 SystemOut     O [Snippet4Case2]After wait: 5, 
                                                    runinto the Snippet4Case2
[9/23/10 13:18:47:359 CST] 00000046 SystemOut     O [Snippet4Case2]The orginial string 
                                                    is: 
                                                    Case1Case2Case1Response
[9/23/10 13:18:47:421 CST] 00000046 SystemOut     O [SyncSnippet]runinto the SyncSnippet
[9/23/10 13:18:47:421 CST] 00000046 SystemOut     O [SyncSnippet]The synced string is: 
                                                    Case1Case2Case1ResponseCase2Response

「ローカル同期合成」パターン

「ローカル同期合成 (Local synchronizing merge)」パターンでは、プロセス内で分岐した複数の入力ブランチが合成されて 1 つの出力ブランチになります。最初から存在するアクティビティーの入力ブランチが有効になった後でも、ローカル情報に応じて新しいブランチを追加することができます。その場合、最初からある入力ブランチと新しい入力ブランチのすべてが合成ポイントに到達すると、出力ブランチがトリガーされます。

例えば、プロジェクト・マネージャーが 1 つのプロジェクトを 3 つの機能コンポーネントに分割し、そのそれぞれを 3 人の開発者に割り当てたとします。けれども開発者が作業を開始した後に、顧客がさらに 2 つの新しい機能を要求してきました。そのため、プロジェクト・マネージャーは 2 つの新しい機能コンポーネントを追加して、2 人の新しい開発者に割り当てなければなりません。プロジェクトをリリースできるのは、すべての機能が完成してからです。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

分析

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

  1. 1 つのブランチが複数のブランチに分岐します。
  2. 複数のブランチが合成されて 1 つの後続ブランチになります。
  3. アクティブなそれぞれの入力ブランチが有効になると、スレッド制御が後続の出力ブランチに渡されます。
  4. 合成する必要のあるブランチの数は、後から決定することができます。

WID では、「Generalized Flow (汎用フロー)」機能を条件付きリンクと併せて使用して、このパターンを実装することができます。

実装

図 72. ローカル同期合成の実装 – SCA コンポーネント
ローカル同期合成の実装 – SCA コンポーネント
図 73. ローカル同期合成の実装 – BPC 実装
ローカル同期合成の実装 – BPC 実装

「Case1 (ケース 1)」、「Case2 (ケース 2)」、および「Case3 (ケース 3)」は同時に開始されます。「DeferCall (遅延呼び出し)」は「Case4 (ケース 4)」または「Case5 (ケース 5)」のどちらに進むかを決定するために入力を待機します。その後、すべてのパスが有効になると 1 つに合成されます。

WebSphere Process Server での実行

  1. 「P37_LocalSyncMerge」インスタンスを開始します。「Case1Case2Case3」と入力します。
図 74. P37_LocalSyncMerge
P37_LocalSyncMerge
  1. インスタンスをクリックします。
図 75. インスタンス・オプション
インスタンス・オプション
  1. 「Waiting Operations (待機処理)」に進み、遅延呼び出しをトリガーします。
図 76. 待機処理
待機処理
  1. 「Case4 (ケース 4)」を選択することを意味する「4」を入力します。
図 77. 入力値
入力値
  1. ログを表示して、ローカル同期合成の結果を確認します。
リスト 14. ローカル同期合成のログ
[8/27/10 10:08:02:765 GMT+08:00] 00000061 SystemOut     O [Local Synchronizing Merge]
                                                            Run into Case1
[8/27/10 10:08:02:765 GMT+08:00] 00000061 SystemOut     O [Local Synchronizing Merge]
                                                            Run into Case2
[8/27/10 10:08:02:765 GMT+08:00] 00000061 SystemOut     O [Local Synchronizing Merge]
                                                            DeferDecide Case4 or Case5
[8/27/10 10:08:02:781 GMT+08:00] 00000061 SystemOut     O [Local Synchronizing Merge]
                                                            Run into Case3
[8/27/10 10:08:43:500 GMT+08:00] 00000052 SystemOut     O [Local Synchronizing Merge]
                                                            Run into Case4
[8/27/10 10:08:43:515 GMT+08:00] 00000052 SystemOut     O [Local Synchronizing Merge]
                                                            Run into Merge

「全般同期合成」パターン

「全般同期合成 (General synchronizing merge)」パターンは、「ローカル同期合成 (Local synchronizing merge)」パターンを拡張したものです。このパターンでは、有効になったブランチの処理が完了しない場合があります。出力ブランチをトリガーできるのは、(1) アクティブな各入力ブランチが有効になった場合、(2) まだ有効になっていないブランチを将来有効にすることが不可能な場合、のいずれかです。

「ローカル同期合成 (Local synchronizing merge)」パターンの例を引用すると、開発フェーズの間に顧客の要件が変更されたため、1 つの機能がキャンセルされたとします。その場合、キャンセルされた機能がなくてもプロジェクトをリリースすることができます。

このパターンの詳しい説明を参照するには、ここをクリックしてください。

分析

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

  1. 1 つのブランチが複数のブランチに分岐します。
  2. 複数のブランチが 1 つの後続ブランチに合成されます。
  3. 合成する必要のあるブランチの数は、後から決定することができます。
  4. アクティブな入力ブランチが有効にされたか、または有効になっていないブランチを将来有効にすることができない場合には、スレッド制御は後続のブランチに渡されます。
  5. ループ構造を使用することができます。

実装

図 78. 全般同期合成の実装 – SCA コンポーネント
全般同期合成の実装 – SCA コンポーネント
図 79. 全般同期合成の実装 – BPC 実装
全般同期合成の実装 – BPC 実装

「Case1 (ケース 1)」、「Case2 (ケース 2)」、および「Case3 (ケース 3)」は同時に開始されます。すると「DeferCall (遅延呼び出し)」は、「Case4 (ケース 4)」または「Case5 (ケース 5)」に進むか、あるいは「Case3 (ケース 3)」に戻るかを決定するための入力を待機します。すべてのパスが有効になると、すべてのパスが 1 つに合成されます。「Case5 (ケース 5)」が選択された場合、合成ポイントでは「Case5 (ケース 5)」が合成されるのを待機しません。

WebSphere Process Server での実行

  1. 「P38_GenrealSyncMerge」インスタンスを開始します。「Case1Case2Case3」と入力します。
図 80. 「P38_GenrealSyncMerge」インスタンス
「P38_GenrealSyncMerge」インスタンス
  1. 作成されたインスタンスをクリックします。
図 81. 作成されたインスタンス
作成されたインスタンス
  1. 「Waiting Operations (待機処理)」に進み、遅延呼び出しをトリガーします。
図 82. 待機処理
待機処理
  1. 「Case3 (ケース 3)」を選択することを意味する「3」を入力します。
図 83. 「3」の入力
「3」の入力
  1. 今度は「5」を入力して「DeferCall (遅延呼び出し)」を再実行します。この場合、「Case5 (ケース 5)」が実行されて、「P37_LocalSyncMerge」インスタンスが完了します。
  2. ログを表示して、全般同期合成の結果を確認します。
リスト 15. 全般同期合成のログ
[8/30/10 15:43:59:453 GMT+08:00] 00000061 SystemOut     O [Local Synchronizing Merge]
                                                            Run into Case1
[8/30/10 15:43:59:453 GMT+08:00] 00000061 SystemOut     O [Local Synchronizing Merge]
                                                            Run into Case2
[8/30/10 15:43:59:468 GMT+08:00] 00000061 SystemOut     O [Local Synchronizing Merge]
                                                            Run into Case3
[8/30/10 15:45:01:437 GMT+08:00] 00000328 SystemOut     O [Local Synchronizing Merge]
                                                            Run into Case3
[8/30/10 15:45:21:937 GMT+08:00] 00000328 SystemOut     O [Local Synchronizing Merge]
                                                            Run into Merge
[8/30/10 15:45:22:218 GMT+08:00] 00000061 SystemOut     O [Local Synchronizing Merge]
                                                            Run into Case5

まとめ

この記事では 12 の高度な分岐パターンと 3 つの同期合成パターンを、それぞれに関連する WID 実装と併せて紹介しました。これらのワークフロー制御パターンを使用すれば、複雑なビジネス・プロセスでも簡潔に構成することができます。


ダウンロード

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

参考文献

コメント

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
ArticleID=591200
ArticleTitle=高度なワークフロー・パターンを WebSphere Integration Developer と WebSphere Process Server で実装する: 第 3 回 高度な分岐および同期合成パターン
publish-date=10282010