Практическое руководство. Включение сохраняемости SQL для рабочих процессов и служб рабочих процессов
В этой статье описывается, как настроить функцию хранилища экземпляров рабочих процессов SQL, чтобы обеспечить сохраняемость рабочих процессов и служб рабочих процессов программным способом и с помощью файла конфигурации.
Windows Server App Fabric упрощает процесс настройки сохраняемости. Дополнительные сведения см. в разделе "Конфигурация сохраняемости App Fabric".
Перед использованием возможности хранилища экземпляров рабочих процессов SQL необходимо создать базу данных, которая используется возможностью для сохранения экземпляров рабочих процессов. Программа установки платформа .NET Framework 4.6.1 копирует файлы скриптов SQL, связанные с функцией хранилища экземпляров рабочих процессов SQL, в папку %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN. Выполните эти файлы скрипта в базе данных SQL Server 2005 или SQL Server 2008, которая должна использоваться в хранилище экземпляров рабочих процессов SQL для сохранения экземпляров рабочих процессов. Сначала запустите файл SqlWorkflowInstanceStoreSchema.sql, а затем файл SqlWorkflowInstanceStoreLogic.sql.
Примечание.
Чтобы очистить базу данных сохраняемости для получения вновь подготовленной базы данных, примените скрипты в каталоге %WINDIR%\Microsoft.NET\Framework\v4.xxx\SQL\EN в следующем порядке.
- SqlWorkflowInstanceStoreSchema.sql
- SqlWorkflowInstanceStoreLogic.sql
Внимание
Если база данных сохраняемости не создана, то при попытке узла сохранить рабочие процессы хранилище экземпляров рабочих процессов SQL вырабатывает исключение, подобное следующему.
System.Data.SqlClient.SqlException: не удается найти хранимую процедуру System.Activities.DurableInstancing.CreateLockOwner
В следующих разделах описывается включение сохраняемости для рабочих процессов и служб рабочих процессов с использованием хранилища экземпляров рабочих процессов SQL. Дополнительные сведения о свойствах хранилища экземпляров рабочих процессов SQL см. в разделе "Свойства хранилища экземпляров рабочих процессов SQL".
Включение сохраняемости для локальных рабочих процессов, использующих 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;
Включение сохраняемости для служб рабочих процессов, размещенных в WAS, использующих WorkflowServiceHost с помощью файла конфигурации
Можно включить сохраняемость для резидентных или размещенных на WAS служб рабочих процессов с помощью файла конфигурации. Служба рабочих процессов, размещенная на WAS, использует WorkflowServiceHost, так же как это делают резидентные службы рабочих процессов.
Поведение SqlWorkflowInstanceStoreBehavior
службы, позволяющее удобно изменять свойства хранилища экземпляров рабочих процессов SQL с помощью xml-конфигурации. Для служб рабочих процессов, размещенных на WAS, используется файл Web.config. В следующем примере конфигурации показано, как настроить хранилище экземпляров рабочих процессов SQL с помощью элемента поведения sqlWorkflowInstanceStore
в файле конфигурации.
<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>
Внимание
Корпорация Майкрософт рекомендует использовать самый безопасный поток проверки подлинности. Если вы подключаетесь к SQL Azure, управляемые удостоверения для ресурсов Azure — это рекомендуемый метод проверки подлинности.
Если не заданы значения свойства connectionString
или connectionStringName
, хранилище экземпляров рабочих процессов SQL использует строку подключения по умолчанию DefaultSqlWorkflowInstanceStoreConnectionString
.
После применения поведения SqlWorkflowInstanceStoreBehavior
хранилищу DurableInstancingOptions.InstanceStore
на WorkflowServiceHost
задается значение объекта SqlWorkflowInstanceStore
, созданного с использованием значений конфигурации. Эти же действия можно выполнить программно для использования SqlWorkflowInstanceStore
с WorkflowServiceHost
(без использования элемента поведения службы).
workflowServiceHost.DurableInstancingOptions.InstanceStore = sqlInstanceStoreObject;
Внимание
В файле Web.config не рекомендуется сохранять конфиденциальные сведения, такие как имена и пароли пользователей. При сохранении в файле Web.config конфиденциальных сведений необходимо обеспечить защиту доступа к файлу Web.config с помощью списков управления доступом файловой системы. Кроме того, можно защитить значения конфигурации в файле конфигурации, как упоминалось в разделе "Шифрование сведений о конфигурации с помощью защищенной конфигурации".
Элементы Machine.config, связанные с функцией хранилища экземпляров рабочих процессов SQL
Установка платформа .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>