長期にわたるプロセスライフサイクル
通常のアプリケーションとは異なり、数日~数か月に及ぶ形で実行が継続することもありえるのがWFアプリケーションにおける特徴の一つです。その場合、実行しているサーバーやクライアントを常に起動し続けているのであれば問題はありませんが、どうしても再起動が必要になることもありえます。一般的なアプリケーションでこのようなケースに対応するためには、アプリケーション側で状態を保持する仕組みを実装しておく必要がありますが、WFではSQL Serverを初めとする外部ストレージに、ワークフローの状態を保存する機能(永続化機能)が標準として提供されています。この機能を利用するのも非常に容易で、次のようなロジックを記述することで利用できます。
Dim wfApp As New WorkflowApplication(New Workflow1()) Dim store As New SqlWorkflowInstanceStore(connectionString) wfApp.InstanceStore = store
WorkflowApplication wfApp = new WorkflowApplication(new Workflow1()); SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(connectionString); wfApp.InstanceStore = store;
全体概略図として掲載した、簡単な図の右下部にSqlWorkflowInstanceStoreクラスが記載されており、そこからSQL Serverへと線が引かれていました。上記のロジックはその部分を表しており、このような記述をすることでワークフローの状態をSQL Serverに保存できるようになります。保存を行うタイミングは実行待ち状態(データの受け取り待機等)の際に自動で行いますが、独自に実装を行うことで異なるタイミングによる保存も可能です。また基底クラスInstanceStoreクラスも公開されていますので、それを継承し独自の保存処理(テキストファイルへの保存や別DBMSへの保存など)を行うことも可能です。
SQL Server上にWF 4用永続化環境を作成するためのスクリプトは.NET Frameworkのインストールされている次のフォルダに用意されています。
- (Windowsフォルダ)\ Microsoft.NET \(Framework または Framework64)\ (バージョン番号)\ SQL \ ja
上記フォルダにスキーマ定義用のSqlWorkflowInstanceStoreSchema.sqlと、トリガーなどの処理定義用のSqlWorkflowInstanceStoreLogic.sqlが保存されており、これを実行するだけで作成できます。同じフォルダにはWF 3用スクリプトも用意されていますが、記載内容がWF 3とは異なるため、注意が必要です。
WF 3.xとWF 4/4.5の違い
一見するとWF 4はWF 3.xのバージョンアップと思われますが、内部構造がすべて変更されています。利用する名前空間もSystem.WorkflowからSystem.Activitiesへと変更されました。大きく変更したためレスポンスは数十倍以上も向上しているのですが、反面WF 3.xで作成されたワークフローを利用できない、というデメリットが発生します。
WF 4ではInteropアクティビティとしてWF 3.xのアクティビティを実行させることができますが、すべてのアクティビティを実行できるものではありません。またCodeplexでWFMigration Kitとして移行ツールが公開されていますが、こちらもすべてのWF 3.xワークフローを移行できるものでもありません。
他にもWF 3.xとWF 4では多くの違いがあります。WF 4ではStatemachine(状態遷移型ワークフロー)が利用できない(注1)という点や、SQL Serverに保存するテーブル構成の変更なども異なります。もし諸条件が許すのであれば、WF 4用に作り直すことが後々を考慮してベターな方法になると考えられます。
そして間もなく登場するであろうWF 4.5では更なる機能強化が図られています。新規アクティビティの追加や、ワークフローデザイナーの強化、実行中のワークフローをバージョンアップする際に利用するバージョニングなどが、WF 4.5において提供されます。
.NET Framework Platform Update 4.0.1(KB2495593)以降を適用することで利用可能です。Platform Update 4.0.1以降というのは、現時点でPlatform Update 4.0.2、Platform Update 4.0.3と公開されており、最新リリースであるPlatform Update 4.0.3では、同4.0.1や同4.0.2の内容も含まれています。なおStatemachine型ワークフローについてはその前身となるプロトタイプ版がCodeplex上で公開されており、こちらは.NET Framework 4上で動作します。
2012/5/16時点ではアクティビティのリソースとして定義されているアイコン情報が置換されます。.NET 4.5は.NET 4のインプレースアップグレード(置き換え形式でのアップグレード)なので、一度 .NET 4.5を導入するとWF 4のアイコンがすべて置き換わることになります。
正式リリースの際にどのようになるかはまだ判明していませんが、WFを利用しかつワークフローのデザイン機能を提供しているケースで今後の情報に注意する必要があります。
WF 4で標準提供されるアクティビティ
WF 4では標準で多くのアクティビティが提供されています。ここでは利用頻度が高めと思われる一部のアクティビティについて説明します。
アクティビティ名 | 説明 |
---|---|
Assign | 作成した変数に値を代入したり、クラスのインスタンス生成時に利用したりします。 |
WriteLine | 標準出力に対して文字列の出力を行います。 |
ForEach | For形式のループ処理を行います。実行するアクティビティが待機状態になった際に、別アクティビティの処理を実行するよう切り替えるParallelForEachアクティビティもあります。 |
If | 条件式の結果に基づき処理を二分岐させます。多分岐を行うSwitchアクティビティもあります。 |
Receive | 外部からメッセージの受け取りを行います。Webサービスの呼び出される受け口などに利用します。 |
Send | 外部へとメッセージの送信を行います。別途用意されているサービスの呼び出しを行う際に利用します。Receiveアクティビティも同様ですが、送受信の際に必要な初期設定があらかじめ行われている状態から利用できる、ReceiveAndSendReply、SendAndReceiveReplyテンプレートデザイナーが用意されていますので、通常はこちらを利用するのが便利です。 |
InvokeMethod | 静的メソッドを呼び出します。ただし引数の数が同一でその型が異なる形でオーバーロードされているようなメソッドは、呼び出すことができません。 |
TryCatch | 例外処理を行います。一般的なコードによる実装に近い形で、例外をトラップした場合に実行するCatchセクションや、必ず実行するFinallyセクションが用意されています。 |
Microsoft製品や.NET FrameworkにおけるWF 4の利用
WF 4は利用可能になってからある程度の年月が過ぎていますが、実際に利用されている製品となるとMicrosoft製品であってもまだ少数です。現在確認できる製品としてはTeam Foundation Server 2010とBizTalk Serverくらいであり、他製品では利用されていないと思われます。Sharepoint Serverはワークフロー機能を提供していますがWF 3.xを利用しています。またWFと同様にデザイナー上でコンポーネントを配置できるSQL Server Integration ServicesやSystem Center OrchestratorはWFを利用せずに独自の実装が行われています。
他には.NET Frameworkの一部でWF 4が利用されているのが確認できています。現在はEntity Frameworkの内部クラスCsdlToSsdlAndMsiActivityクラスとSsdlToDdlActivityクラスがWF 4のアクティビティとして作成されていました。
次回予定
次回はWF 4の実装について紹介します。3種類存在するアクティビティの違いとその実装について、そしてアクティビティデザイナーについても紹介する予定です。