WFの扱うワークフロー
WFでは、大きく分けて2種類のワークフローを扱うことができます。
- シーケンシャルワークフロー
- ステートマシンワークフロー
シーケンシャルワークフロー
シーケンシャルワークフローは、ワークフロー開始からアクティビティを実行していき、最後のアクティビティが完了するまで順に処理が流れていくワークフローです。先に上げた購入申請フローはシーケンシャルワークフローの1つと言えます。
ただし、シーケンシャルワークフローは厳密な逐次処理ではなく、複数のアクティビティを同時に実行することもできますので、処理の順番が厳密に定められているわけではありません。
ステートマシンワークフロー
ステートマシンワークフローは、さまざまな状態(ステート)を含んでおり、イベントに応じてステート間を遷移しながら処理を行い、最終状態に遷移していくワークフローです。
例えば通信販売の管理システムでは、各注文に関して
- 初期状態(注文前)
- 注文完了
- 決済完了
- 発送完了
といった状態があるでしょう。それぞれの状態に対して、例えば次のようなイベント・アクションが考えられます。
- 初期状態:注文イベント→注文感謝メール送付アクション・注文完了へ遷移
- 注文完了:決済イベント→決済確認メール送付アクション・決済完了へ遷移
- 注文完了:キャンセルイベント→注文を削除してワークフロー終了
- 決済完了:商品発送イベント→発送完了へ遷移
- 発送完了:商品到着イベント→ワークフロー終了
このように、ステートマシンワークフローはイベントをトリガにしてアクションを実行し、ステートを遷移しながら処理を行います。
こうした状態遷移を持つモデルを実装する場合、ステート管理が煩雑になりがちです。しかしWFでは、ステート管理やワークフローに伴うさまざまな処理をWFの提供するフレームワークに任せることができます。
それぞれの特徴
シーケンシャルワークフローは、処理シーケンスをモデル化したもので、基本的に止まることなく処理が続いて流れていきます(もちろん、アクション内でブロックが発生して処理が止まることはあります)。
それに対し、ステートマシンワークフローはステートを中心に、ステート間を繋ぐイベントとアクションをモデル化したもので、イベントがない限り処理は止まっており、イベントが発生した時点でアクションが実行されてステートが変化していきます。
実は、シーケンシャルワークフローはステートマシンワークフローの特殊なパターン(初期状態と終了状態以外のステートを持たないステートマシンワークフロー)と言えます。従って、すべてのシーケンシャルワークフローはステートマシンワークフローとして表現できます。実装では、扱う対象が特にステートを持たず、シーケンシャルワークフローで表現できるものか、ステート・イベント・アクションの組み合わせで構成されるステートマシンワークフローで表現する必要があるものか、を検討しなければなりません。
WFのアーキテクチャ概観
WFのアーキテクチャは次のようになっており、ホストプロセス上にWFの提供するフレームワークが載り、その上でアクティビティ群を実行するイメージとなります。
ランタイムサービスでは、後ほど触れる永続化サービスやトランザクション管理など、ワークフローをホスティングする際に任意に追加可能なサービスが提供されます。
アクティビティフレームワークでは、アクティビティの例外ハンドリングや直列化サービス、Visual Studioのデザイナ上でアクティビティを配置するためのビジュアライザなどが提供されます。
最上位に来るのがワークフローを構成するアクティビティ群です。WFでは、本項で扱う標準アクティビティだけでなく、自作のカスタムアクティビティもワークフローエンジン上で実行できます。
WFのWebページでは、メール送信アクティビティやForEach・Switchといった条件分岐のためのアクティビティなど、さまざまなカスタムアクティビティが紹介されています。ぜひ試してみてください。
WFのメリット
先ほどワークフローを使うことのメリットを列挙しましたが、さらにWFでワークフローを実行することには、次のようなメリットがあります。
ホスティング方法が任意
WFには特別なサーバアプリケーションは存在しません。WFを使うことで、ワークフローをASP.NET WebサービスやWindows Forms、コンソールアプリケーションといった、さまざまな種類のアプリケーションでホスティングできます。
WCF/WFはサービスのホスティングに関して、アプリケーションの種類には依存していません。
また、WPFはUIに直接関係するフレームワークのため、どんなアプリケーション形態でも使えるわけではありませんが、それでもWindowsアプリケーションだけでなく、XAMLブラウザアプリケーションというWebベースのアプリケーション形態を持っています。
アプリケーション形態ごとに使用する技術がバラバラでは覚えるのも大変です。一度覚えればさまざまな場面に応用できる点はこれらのフレームワークのメリットと言えるでしょう。
長期のアクティビティへの対応・ワークフローの永続化
ワークフローの中にはそのコンピュータ内で完結する、あるいは他のコンピュータと通信するなどの比較的短時間(~数十秒)で終了するアクティビティだけでなく、上長が決裁ボタンを押すなど、人間がかかわるために終了までにかなりの時間(~数日)がかかるアクティビティも存在します。
こうした長期間にわたるアクティビティを実行する場合、多数のアクティビティが長期間メモリ上に待機することになって、性能劣化を引き起こしかねません。WFではアイドル状態になったワークフローをSQL Serverなどに永続化させることができ、長期間にわたるワークフロー実行をサポートしています