ビジネス要件をBPMNで記述してみよう(前編)BPMNを活用したビジネスプロセス・モデリング(3)

 複雑なビジネス要件を表現しようとすると、第2回「BPMNの基本要素を理解する」で解説した基本要素だけでは力不足を感じます。そこで必要になるのが各基本要素の詳細なバリエーションです。今回は、「アクティビティ」と「イベント」のバリエーションについて解説します。

» 2005年05月28日 12時00分 公開
[明庭聡(日揮情報ソフトウェア 技術本部・モデリング技術部),@IT]

アクティビティのバリエーション

■ 階層的なプロセス・モデリング

 ビジネスプロセスをモデリングする際に「ハイレベルなアクティビティをとらえてプロセス全体の概要を表すダイヤグラムを記述してから、別のダイヤグラムでローレベルな詳細にブレークダウンする」といった方法が取られることがあります。この階層的なモデリングを実現する図形要素が、アクティビティの内部にさらに下位のプロセスを持つ「サブプロセス」です。サブプロセスには、図1に示すように「折り畳まれたサブプロセス」と「展開されたサブプロセス」の2つがあります。折り畳まれたサブプロセスでは、下部中央にプラス記号を付けて下位レベルの詳細があることを示しますが、その詳細を記述しません。一方、展開されたサブプロセスでは、サブプロセスの中にその詳細な構成を記述します。複数のダイヤグラムに分かれていてもモデリング・ツールの機能によって「展開する」と「折り畳む」といった操作を簡易に実現でき、上位レベルの概要プロセスと下位レベルの詳細プロセスを自由自在に参照できることを前提としたものです。

 サブプロセスに対し、それ以上ブレークダウンされないアクティビティを「タスク」と呼びます。以降、タスクとサブプロセスの両方を対象とする場合は「アクティビティ」と記述し、いずれかを表す場合は「タスク」または「サブプロセス」と記述します。記述の違いに注意してください。

ALT 図1 階層的なプロセス・モデリングに使用する図形要素

■ アクティビティの性質を表すマーカー

 アクティビティの下部中央にマーカー(記号)を付けて、アクティビティの詳細な性質を表すことができます。どのようなマーカーがあるのか、その一覧を図2に示します。図2のサブプロセスでは、折り畳まれたサブプロセスを例示していますが、展開されたサブプロセスでも同様に下部中央にマーカーを付けることができます。

ALT 図2 アクティビティの性質を表すマーカー

 「ループ」マーカーは、アクティビティを繰り返して実行することを表します。「マルチインスタンス」マーカーは、アクティビティを複数、同時並行で実行することを表します。「アドホック」マーカーは、サブプロセス内のアクティビティを実行する順序を事前に定義せず、サブプロセスの実行者によって実行順序が判断されることを表します。「補償」マーカーについては、後述の「トランザクションを表現する」で説明します。

 図3に示す「@ITの記事を投稿する」プロセスでは「記事を執筆する」サブプロセスにループとアドホックを付けています。ループは「(記事のレビュー者がOKとするまで)何度も繰り返して記事を執筆する」ことを表し、アドホックは「執筆者が本文を書くなどの作業をどの順序で進めてもよい」ことを表しています。ループの代わりにマルチインスタンスを付けると「複数の執筆者が同時に記事を執筆し、すべての執筆者が書き上げたらまとめて記事を送る(受け取った編集者は一番良いものを選ぶ)」といった状況を表すことになります。

ALT 図3 「ループ」と「アドホック」マーカーを付けたサブプロセスの例

◆ イベントのバリエーション

 イベントはプロセスの進行タイミングを制御するもので、ある事象の発生待ちを表現するものです。事象の発生地点によって、開始イベント、中間イベント、終了イベントの3つに区別されます。

  • 開始イベントはプロセスの開始点を表し、待っている事象が発生したらプロセスを開始する
  • 中間イベントはプロセスの途中で発生する事象を表す
  • 終了イベントはプロセスの終了点を表し、プロセスの終了時に(ほかのプロセスが待っている)事象を発生させる

 開始イベントが事象を待ち、終了イベントが事象を発生させることからも分かるように、待っている事象を進行させる「トリガー(Trigger)」と呼ばれる役割、そのトリガーを待つ「結果(Result)」と呼ばれる役割、この2つによって事象の発生待ちを表します。どちらの役割なのかを把握することがイベントを正確に理解するポイントです。以降の説明においては、分かりやすいようにトリガーの役割を「送り手」、結果の役割を「受け手」と記述します。イベントを待っている「受け手」に対して「送り手」がイベントを送ると、「受け手」の次のステップに進行するといったイメージを、まずはしっかりと持ってください。そして、役割の違いを意識しながら読み進めてください。

 図4に示すように内部にマーカーを付けることで、どのようなタイプのイベントを送ったり受けたりするのかを視覚的に表現することができるようになっています。ただし、マーカーなしの場合は例外で、イベントの送受を特に意識する必要はありません。開始イベントでは何も待たずにプロセスを開始することを表し、終了イベントではプロセスの終了時に何もイベントを発生させないことを表します(モデラーがイベントのタイプを規定せず、後のフェイズで詳細化するときに規定するといった使い方もできます)。

ALT 図4 イベントのタイプを表すマーカー

■ メッセージ

 「メッセージ」マーカーは、メッセージフローを待っている状態を表現するものです。メッセージ開始イベントとメッセージ中間イベントはほかのプールからのメッセージを受信する「受け手」の役割になり、メッセージ終了イベントはメッセージを待っているプールにメッセージを送信する「送り手」の役割になります。図5は「見積もり依頼を受けたらプロセスを開始し、見積もり回答を送ったら発注を待ち、商品を出荷したら出荷完了通知を送ってプロセスを終了する」といったフローを表しています。

ALT 図5 メッセージイベントの例

■ タイマー

 「タイマー」マーカーは、あらかじめ決められた時間が経過するまで待っている状態を表現するものです。時計やカレンダーが「送り手」になって、タイマーイベントが「受け手」になるといったイメージになります。図6では、タイマー開始イベントとタイマー中間イベントを使用して、決められた時間(10時から18時まで)にチケットを販売することを表しています。なお、図6のように中間イベントをアクティビティの境界に配置する表記を「例外フロー」と呼びます。中間イベントが配置されているアクティビティの実行中にイベントを受けたら、そのアクティビティの実行をやめて例外フローに進みます。図6の例では「18時までにすべてのチケットが売れたら売り切れを掲示し、売れずに閉店時間の18時になったら販売をやめる」ことを表しています。

ALT 図6 タイマーイベントの使用例

■ 停止

 「停止」マーカーは、プロセスを終了させる条件を変更するものです。同時並行で流れる複数のフローが終了イベントに到達する場合に、マーカーがない通常の終了イベント、停止終了イベントを使い分けます。通常の終了イベントでは全てのフローが終了イベントに到達するのを待ってからプロセスを終了しますが、「停止」マーカーを付けると、最初の1つのフローが終了イベントに到達した時点で即時にプロセスを終了します。

■ リンク

 「リンク」マーカーは、2つの使い方ができます。その1つは、リンク中間イベントをペア(「送り手」と「受け手」)にして使用する表記法です。「ビジネスプロセス図が複数のページにまたがる場合にページ間のつながりを表す」「複雑に交差するシーケンスフローをわかりやすくする」などの目的で、本来は1つのシーケンスフローを2つに分割する際に使用します。例えば、複数ページにまたがる場合に、最初のページでは「リンクA」と名前をつけたリンク中間イベントでフローを終えて、次のページでは同じ名前をつけたリンク中間イベントでフローをはじめるといった使い方をします。

 もう1つは、リンク終了イベントをフローの「送り手」とし、リンク開始イベントまたはリンク中間イベントをフローの「受け手」として使用する表記法です。同時並行で実行されているサブプロセス間の同期をとるために使用します。例えば、サブプロセスAの先頭タスクが終了するのを待ってからサブプロセスBを開始して、サブプロセスAの先頭以外のタスクとサブプロセスBを同時並行で実行させる場合に使用します。その場合には、サブプロセスAの先頭タスクのあとに、リンク終了イベントで終わる同期専用のフロー(サブプロセスAの後続タスクへの流れとは別のフロー)を記述して、サブプロセスBはリンク開始イベントからはじめるといった使い方をします。

■ ルール

 「ルール」マーカーは、「在庫が10個未満になったら」など、あらかじめ規定されたルールが満たされるまで待つことを表現するものです。自らが「送り手」と「受け手」の両方の役割を持ちます。タイマーイベントと同様に、通常のフローではルール開始イベントとルール中間イベントを使用することができ、例外フローとしてルール中間イベントを使用することができます。

■ 複合

 「複合」マーカーは、複数のイベントを組み合わせたものです。次のような使い方ができます。

  • 複合開始イベントは「受け手」の役割として、待っている複数のイベントのうち、最初のイベントを受けたらプロセスを開始する
  • 複合中間イベントは「受け手」の役割として、待っている複数のイベントのうち、最初のイベントを受けたら次にフローを流す
  • 複合終了イベントは「送り手」の役割として、複数のイベントのすべてを発生させてプロセスを終了する

 そのほかのマーカー「補償」「キャンセル」「エラー」については、後述の「トランザクションを表現する」で説明します。

トランザクションを表現する

 依存性が高い作業を1つにまとめ、それらの作業が「すべてが実行される」または「すべてが実行されない」のいずれかになることを保証する処理を「トランザクション」と呼びます。図7における「航空券は予約できたが、ホテルは予約できない」といった状況など、一部の作業だけが実行されてしまう中途半端な状態にならないように管理するものです。サブプロセスの外枠を二重線にして、そのサブプロセスがトランザクションであることを表します。

ALT 図7 トランザクションの例

 トランザクションの実行結果として、成功終了、失敗終了、異常終了の3つがあります。成功終了とはトランザクション内にあるすべてのアクティビティの実行結果が成功と判断されるケースで、サブプロセスを終了して通常のフロー(図7の「成功終了」)に流れます。失敗終了と異常終了を表現するためには、以下に説明する補償、キャンセル、エラーを使用します。

■ 補償

 アクティビティの実行結果が望ましくないと判断されるときに、そのアクティビティを実行する前の状態に戻す処理を「補償」と呼びます。補償の具体的な処理は、図7の「航空券の予約をキャンセルする」のように「補償」マーカーを付けたアクティビティで表現します。そして、補償処理がどのアクティビティに対するものなのかを表現するために、「補償」マーカーを付けた中間イベント、矢印を付けた関連、この2つを使って対象のアクティビティ(図7の「航空券を予約する」)と結び付けます。

 補償は通常のフローとは別のものとして位置付けられるため、シーケンスフローではなく関連を使って補償中間イベントと補償アクティビティを結びます。また、補償アクティビティから出力するシーケンスフローも記述しません。図7では、次に説明するキャンセルが補償のキッカケを作る「送り手」となるため、「送り手」を記述していませんが、補償中間イベントまたは補償終了イベントを使って「送り手」を表すこともできます。

■ キャンセル

 「キャンセル」マーカーを付けたイベントは、トランザクションを表すサブプロセスの中で使用され、トランザクションのキャンセルを表現します。キャンセル終了イベントが「送り手」となってキャンセルを発生させ、サブプロセスの境界に配置されたキャンセル中間イベントが「受け手」となってキャンセルを受け取ります。キャンセルを受け取ると、トランザクションの実行をやめて例外フロー(図7の「失敗終了」)に流れます。ただし、トランザクションの中に補償アクティビティがある場合には、例外フローに流れる前にすべての補償アクティビティが実行されます。なお、図7では明示的にキャンセル終了イベントを記述していますが、明示しないことも認められており、その場合にはトランザクションの実行環境が発生させる任意のキャンセルを受け取ることを表します。

■ エラー

 「エラー」マーカーを付けたイベントは、エラー処理を表現するもので、トランザクション以外でも使用することができます。通常のフローに配置されたエラー中間イベントまたはエラー終了イベントが「送り手」となってエラーを発生させ、アクティビティの境界に配置されたエラー中間イベントが「受け手」となって発生したエラーを受け取ります。エラーを受け取ると、すぐに例外フロー(図7の「異常終了」)に流れます。トランザクションの中に補償アクティビティがあっても、補償の処理はされず、まさに成功終了でも失敗終了でもない異常なケースを表します。図7のようにエラーの「送り手」を明示せず、任意のエラーを受け取ることを表すこともできます。

 今回は「アクティビティ」と「イベント」について詳細に解説してきました。BPMNが持つ豊かな表現能力の一部を実感することができたのではないでしょうか。次回は、残る「ゲートウェイ」と「シーケンスフロー」のバリエーションについて解説する予定です。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ