ワークフローとワークフロー サービスの SQL 永続化を有効にする方法
この記事では、ワークフローとワークフロー サービスの永続性をプログラムと構成ファイルの両方から使用して有効にできるように、SQL Workflow Instance Store の機能を構成する方法について説明します。
Windows Server App Fabric を使用すると、永続化の構成のプロセスを簡潔化できます。 詳細については、AppFabric の永続化の構成に関するページを参照してください。
SQL Workflow Instance Store 機能を使用する前に、この機能においてワークフロー インスタンスの永続化に使用するデータベースを作成します。 .NET Framework 4.6.1 セットアップ プログラムによって、SQL Workflow Instance Store 機能に関連する SQL スクリプト ファイルが %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN フォルダにコピーされます。 これらのスクリプト ファイルは、SQL Workflow Instance Store がワークフロー インスタンスの永続化に使用する SQL Server 2005 または SQL Server 2008 のデータベースに対して実行します。 最初に SqlWorkflowInstanceStoreSchema.sql ファイルを実行してから、SqlWorkflowInstanceStoreLogic.sql ファイルを実行します。
注意
永続性データベースをクリーンアップして新しいデータベースにするには、%WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN にあるスクリプトを次の順序で実行します。
- SqlWorkflowInstanceStoreSchema.sql
- SqlWorkflowInstanceStoreLogic.sql
重要
永続性データベースを作成しない場合、ホストがワークフローを永続化しようとしたときに、SQL Workflow Instance Store 機能によって次のような例外がスローされます。
System.Data.SqlClient.SqlException: ストアド プロシージャ 'System.Activities.DurableInstancing.CreateLockOwner' が見つかりませんでした。
以下のセクションでは、SQL Workflow Instance Store を使用してワークフローとワークフロー サービスの永続性を有効にする方法について説明します。 SQL Workflow Instance Store のプロパティの詳細については、「SQL Workflow Instance Store のプロパティ」を参照してください。
WorkflowApplication を使用する自己ホスト型ワークフローの永続化の有効化
WorkflowApplication オブジェクト モデルを使用して、プログラムから SqlWorkflowInstanceStore を使用する自己ホスト型ワークフローの永続化を有効にすることができます。 これを行う手順を次に示します。
System.Activities.DurableInstancing.dll への参照を追加します。
ソース ファイルの先頭にある既存の "using" ステートメントの後に、次のステートメントを追加します。
using System.Activities.DurableInstancing;
次のコード例に示すように、SqlWorkflowInstanceStore を構築して InstanceStore の WorkflowApplication に割り当てます。
SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore("Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI"); WorkflowApplication wfApp = new WorkflowApplication(new Workflow1()); wfApp.InstanceStore = store;
注意
使用している SQL Server のエディションによって、接続文字列のサーバー名は異なる可能性があります。
Persist オブジェクトの WorkflowApplication メソッドを呼び出してワークフローを永続化するか、Unload メソッドを呼び出してワークフローを永続化およびアンロードします。 また、PersistableIdle オブジェクトによって発生した WorkflowApplication イベントを処理して、Persist の適切なメンバー (Unload または PersistableIdleAction) を返すこともできます。
wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e) { return PersistableIdleAction.Persist; };
注意
詳細な手順については、「チュートリアル入門」の「方法: 長時間にわたって実行されるワークフローを作成して実行する」のステップを参照してください。
WorkflowServiceHost を使用する自己ホスト型ワークフロー サービスの永続化の有効化
WorkflowServiceHost クラスまたは SqlWorkflowInstanceStoreBehavior クラスを使用して、プログラムから DurableInstancingOptions を使用する自己ホスト型ワークフロー サービスの永続化を有効にすることができます。
SqlWorkflowInstanceStoreBehavior クラスの使用
SqlWorkflowInstanceStoreBehavior クラスを使用して、自己ホスト型ワークフロー サービスの永続化を有効にする手順を次に示します。
System.ServiceModel.dll への参照を追加します。
ソース ファイルの先頭にある既存の "using" ステートメントの後に、次のステートメントを追加します。
using System.ServiceModel.Activities.Description;
WorkflowServiceHost
のインスタンスを作成し、ワークフロー サービスのエンドポイントを追加します。WorkflowServiceHost host = new WorkflowServiceHost(new CountingWorkflow(), new Uri(hostBaseAddress)); host.AddServiceEndpoint("ICountingWorkflow", new BasicHttpBinding(), "");
SqlWorkflowInstanceStoreBehavior
オブジェクトを作成して、動作オブジェクトのプロパティを設定します。SqlWorkflowInstanceStoreBehavior instanceStoreBehavior = new SqlWorkflowInstanceStoreBehavior(connectionString); instanceStoreBehavior.HostLockRenewalPeriod = new TimeSpan(0, 0, 5); instanceStoreBehavior.InstanceCompletionAction = InstanceCompletionAction.DeleteAll; instanceStoreBehavior.InstanceLockedExceptionAction = InstanceLockedExceptionAction.AggressiveRetry; instanceStoreBehavior.InstanceEncodingOption = InstanceEncodingOption.GZip; instanceStoreBehavior.RunnableInstancesDetectionPeriod = new TimeSpan("00:00:02"); host.Description.Behaviors.Add(instanceStoreBehavior);
ワークフロー サービス ホストを開きます。
host.Open();
DurableInstancingOptions プロパティの使用
SqlWorkflowInstanceStoreBehavior
が適用される場合、DurableInstancingOptions.InstanceStore
の WorkflowServiceHost
は構成値を使用して作成された SqlWorkflowInstanceStore
オブジェクトに設定されます。 同じ内容をプログラムから実行するには、次のコード例に示すように、DurableInstancingOptions クラスを使用せずに WorkflowServiceHost
の SqlWorkflowInstanceStoreBehavior
プロパティを設定します。
workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;
WorkflowServiceHost を使用する WAS でホストされるワークフロー サービスの構成ファイルを使用した永続化の有効化
構成ファイルを使用することで、自己ホスト型または Windows プロセス アクティブ化サービス (WAS) でホストされるワークフロー サービスの永続化を有効にできます。 WAS でホストされるワークフロー サービスは、自己ホスト型ワークフローのように WorkflowServiceHost を使用します。
SqlWorkflowInstanceStoreBehavior
は、XML 構成によって SQL Workflow Instance Store のプロパティを簡単に変更できるサービスの動作です。 WAS でホストされるワークフロー サービスの場合は、Web.config ファイルを使用します。 次の構成例では、構成ファイルで sqlWorkflowInstanceStore
という動作要素を使用して SQL Workflow Instance Store を構成する方法について説明します。
<serviceBehaviors>
<behavior name="">
<sqlWorkflowInstanceStore
connectionString="Data Source=(local);Initial Catalog=DefaultPersistenceProviderDb;Integrated Security=True;Async=true"
instanceEncodingOption="GZip | None"
instanceCompletionAction="DeleteAll | DeleteNothing"
instanceLockedExceptionAction="NoRetry | BasicRetry |AggressiveRetry"
hostLockRenewalPeriod="00:00:30"
runnableInstancesDetectionPeriod="00:00:05" />
</behavior>
</serviceBehaviors>
重要
Microsoft では、使用可能な最も安全な認証フローを使用することをお勧めします。 Azure SQL に接続する場合は、Azure リソースの管理 ID が推奨される認証方法です。
connectionString
または connectionStringName
プロパティの値が設定されていない場合、SQL Workflow Instance Store は既定の名前付き接続文字列 DefaultSqlWorkflowInstanceStoreConnectionString
を使用します。
SqlWorkflowInstanceStoreBehavior
が適用される場合、DurableInstancingOptions.InstanceStore
の WorkflowServiceHost
は構成値を使用して作成された SqlWorkflowInstanceStore
オブジェクトに設定されます。 同じ内容をプログラムから実行するには、サービスの動作要素を使用せずに SqlWorkflowInstanceStore
を WorkflowServiceHost
と一緒に使用します。
workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;
重要
ユーザー名やパスワードなどの機密情報は、Web.config ファイルに保存しないことをお勧めします。 Web.config ファイルに機密情報を保存する場合は、ファイル システムのアクセス制御リスト (ACL) を使用して、Web.config ファイルへのアクセスをセキュリティで保護する必要があります。 また、「保護された構成を使用した構成情報の暗号化」で説明しているように、構成ファイル内の構成値をセキュリティで保護することもできます。
SQL Workflow Instance Store 機能に関連する Machine.config の要素
.NET Framework 4.6.1 インストールが、次の動作拡張要素を Machine.config ファイルに追加することで、構成ファイルで <sqlWorkflowInstanceStore>
サービスの動作要素を使用してサービスの永続化を設定できるようにします。
<configuration>
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="sqlWorkflowInstanceStore" type="System.Activities.DurableInstancing.SqlWorkflowInstanceStoreElement, System.Activities.DurableInstancing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</behaviorExtensions>
</extensions>
</system.serviceModel>
</configuration>
.NET