2011年4月23日土曜日

永続化を行う理由と Persist アクティビティ

Workflow Foundation における永続化は記憶領域にワークフローの状態を(もしくはインスタンス自体も)保存することです。そもそも何故永続化が必要になるか、というところではワークフローが通常のアプリケーションと異なり、実行状態となる時間が長くなる可能性が高いところにあります。

実行中の状態が継続している場合、考えなくてはならない点に「実行環境の障害対策」が出てきます。例えば実行中にハードウェアな障害が発生したので、その際に実行していたワークフローは全てリセットされました、では非常に困るわけです。それを回避するためにも意識的に永続化を行い、ある時点の状態にまで復元できるようにする必要があります。

ワークフローを永続化するためには条件があり、「ワークフローがアイドル(待機)状態であること」というのを適えている事が必要です。このアイドル状態というのは Delay アクティビティで明示的な待機状態にしている場合や、カスタマイズしたアクティビティ内部で「現在は待機状態です」というステータスを返却した場合などがあります。またワークフローを実行する際には何通りか方法があることは前述しましたが、WorkflowInvoker を利用している場合は永続化が行えません。

それらを踏まえた上で永続化に対応するには次の点に対応する必要があります。

  • インスタンスストアの指定

WorkflowApplication 等で永続化を行うには WorkflowApplication.InstanceStore プロパティに永続化を行うためのクラスを指定する必要があります。SQL Server で永続化を行う場合、SqlWorkflowInstanceStore クラスがあらかじめ用意されているのでこれを利用します。

1: Dim persistInstance As DurableInstancing.SqlWorkflowInstanceStore = Nothing
2: Dim conBuild As New System.Data.SqlClient.SqlConnectionStringBuilder
3: conBuild.DataSource = "127.0.0.1\SQLEXPRESS"
4: conBuild.InitialCatalog = "WF4"
5: conBuild.IntegratedSecurity = True
6: persistInstance = New DurableInstancing.SqlWorkflowInstanceStore(conBuild.ToString)
7: 

大体このような感じで利用できます。

  • WorkflowApplication.PersistableIdle イベントの対応

PersistableIdle イベントは WorkflowApplication にて実行中のワークフローで永続化可能なアイドル状態が発生した際に通知されるイベントです。このイベントが発生した際に、永続化を行うステータスを返却します。

1: Private Function PersistableIdle(ByVal e As WorkflowApplicationIdleEventArgs) As PersistableIdleAction
2:     Return PersistableIdleAction.Persist
3: End Function

ここで返却できる値は Persist の他に None (永続化しない)、Unload (インスタンスも永続化する) があります。それらの挙動についてはまた別の機会で書こうと思います。このメソッドを WorkflowApplication.PersistableIdle プロパティに設定します。

  • ワークフローでアイドル状態を発生させる

先程の Delay アクティビティとかもそうですが、もう一つ明示的に永続化を指定するために Persist アクティビティがあります。

Persist

見ていただくとわかるのですが、ワークフロー上に配置するだけという簡素なアクティビティです。制御がこのアクティビティに来たタイミングで PersistableIdle イベントが発生し、そこからの戻り値により永続化が WorkflowApplication.InstanceStore プロパティに設定されているクラスに指示されます。

永続化を利用するには、これだけの処理で可能となります。

0 件のコメント:

コメントを投稿