Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При создании нового экземпляра рабочего процесса, сохраняющего свое состояние в экземпляре SqlWorkflowInstanceStore, узел службы создает для неё запись в хранилище. Впоследствии, когда экземпляр рабочего процесса сохраняется в первый раз, SqlWorkflowInstanceStore фиксирует текущее состояние экземпляра. Если рабочий процесс размещён в службе активации процесса Windows, данные о развертывании службы также записываются в хранилище экземпляров при первом сохранении экземпляра.
Если экземпляр рабочего процесса не был сохранен, он находится в не сохраняемом состоянии. Хотя в этом состоянии экземпляр рабочего процесса не может быть восстановлен после перезагрузки домена приложения, сбоя узла или сбоя компьютера.
Не сохраняемое состояние
Экземпляры устойчивых рабочих процессов, которые не были сохранены, остаются в не сохраняемом состоянии в следующих случаях:
Хост службы аварийно завершает работу до того, как экземпляр рабочего процесса сохраняется в первый раз. Экземпляр рабочего процесса остается в хранилище экземпляров и не подлежит восстановлению. При поступлении коррелированного сообщения экземпляр рабочего процесса снова становится активным.
Экземпляр рабочего процесса испытывает исключение, прежде чем оно сохраняется в первый раз. В зависимости от возвращаемого UnhandledExceptionAction, выполняются следующие сценарии:
UnhandledExceptionAction имеет значение Abort: при возникновении исключения сведения о развертывании службы записываются в хранилище экземпляров, а экземпляр рабочего процесса выгружается из памяти. Экземпляр рабочего процесса остается в не сохраняемом состоянии и не может быть перезагружен.
UnhandledExceptionAction установлен в Cancel или Terminate: при возникновении исключения информация о развертывании службы записывается в хранилище экземпляров, а состояние экземпляра действия устанавливается в Closed.
Чтобы свести к минимуму риск возникновения выгруженных и не сохранённых экземпляров рабочих процессов, рекомендуется обеспечить сохранение рабочего процесса на ранних этапах его жизненного цикла.
Обнаружение и удаление не сохраняемых экземпляров
Хранилище экземпляров SqlWorkflowInstanceStore не удаляет не сохранённые экземпляры рабочих процессов. Кроме того, он не удаляет владельцев блокировки с истекшим сроком действия, которые имеют не сохраняемые экземпляры рабочих процессов, связанные с ними.
Мы рекомендуем администратору периодически проверять хранилище экземпляров на предмет несохранённых экземпляров. Администраторы могут удалить эти экземпляры из хранилища экземпляров, если они знают, что этот рабочий процесс не получит коррелированных сообщений. Например, если экземпляр находится в базе данных уже несколько месяцев и известно, что рабочий процесс обычно длится несколько дней, можно с уверенностью считать, что это был инициализированный экземпляр, который вышел из строя.
Чтобы найти непостоянные экземпляры в хранилище экземпляров SQL Workflow, вы можете использовать следующие запросы SQL:
Этот запрос находит все экземпляры, которые не были сохранены, и возвращает идентификатор и время создания (хранящиеся в формате UTC) для них.
select InstanceId, CreationTime from [System.Activities.DurableInstancing].[Instances] where IsInitialized = 0Этот запрос находит все экземпляры, которые не были сохранены, и которые не загружены, и возвращает идентификатор и время создания (хранящиеся в формате UTC) для них.
select InstanceId, CreationTime from [System.Activities.DurableInstancing].[Instances] where IsInitialized = 0 and CurrentMachine is NULLЭтот запрос находит все приостановленные экземпляры, которые не были сохранены, и возвращает идентификатор, время создания (хранящееся в формате UTC), причину приостановки и имя исключения для них.
select InstanceId, CreationTime, SuspensionReason, SuspensionExceptionName from [System.Activities.DurableInstancing].[Instances] where IsInitialized = 0 and IsSuspended = 1
Используйте осторожность при удалении не сохраняемых экземпляров. Как правило, можно безопасно удалить не хранящиеся экземпляры, созданные WorkflowServiceHost, которые приостановлены или не загружены. Эти определенные экземпляры можно удалить из хранилища, удалив их из [System.Activities.DurableInstancing].[Instances] представления с помощью следующей команды SQL, заменив правильный идентификатор экземпляра.
delete [System.Activities.DurableInstancing].[Instances]
where InstanceId=’078a9bc4-ada5-4f9e-8cce-b0eb0009995f’
Предупреждение
Мы не рекомендуем удалять все не сохранённые экземпляры, потому что это включает в себя экземпляры, которые только что были созданы и еще не были сохранены.