Экземпляры нематериализованного рабочего процесса
При создании нового экземпляра рабочего процесса, состояние которого сохраняется в SqlWorkflowInstanceStore, узел службы создает запись для этой службы в хранилище экземпляров. Затем при первом сохранении экземпляра рабочего процесса SqlWorkflowInstanceStore сохраняет текущее состояние экземпляра. Если рабочий процесс размещен в службе активации Windows, данные развертывания службы также записываются в хранилище экземпляров при первом сохранении экземпляра.
Если экземпляр рабочего процесса не был сохранен, он находится в не сохраняемом состоянии. Если экземпляр рабочего процесса находится в этом состоянии, его нельзя восстановить после очистки домена приложения, ошибки узла или сбоя в работе компьютера.
Несохраняемое состояние
Несохраненные устойчивые экземпляры рабочего процесса остаются в несохраняемом состоянии в следующих случаях.
Сбой узла службы происходит до первого сохранения экземпляра рабочего процесса. Экземпляр рабочего процесса остается в хранилище экземпляров. Не выполняется восстановление этого экземпляра. Если поступает связанное сообщение, экземпляр рабочего процесса вновь становится активным.
Экземпляр рабочего процесса формирует исключение до его первого сохранения. В зависимости от возвращаемого UnhandledExceptionAction выполняется следующий сценарий:
Для UnhandledExceptionAction задается Abort: при формировании исключения данные развертывания службы записываются в хранилище экземпляров и экземпляр рабочего процесса выгружается из памяти. Экземпляр рабочего процесса остается в несохраняемом состоянии и не может быть выгружен.
Для UnhandledExceptionAction задается Cancel или Terminate: при формировании исключения данные развертывания службы записываются в хранилище экземпляров и для экземпляра действия задается состояние Closed.
Чтобы свести к минимуму риск возникновения невыгруженных несохраняемых экземпляров рабочих процессов, рекомендуется сохранять рабочие процессы на ранних этапах жизненного цикла.
Обнаружение и удаление несохраняемых экземпляров
SqlWorkflowInstanceStore не удаляет из хранилища экземпляров несохраняемые экземпляры рабочих процессов. Также не удаляются владельцы блокировок, срок действия которых истек и с которыми связаны несохраняемые экземпляры рабочих процессов.
Администратору рекомендуется выполнять регулярную проверку хранилища экземпляров на наличие несохраняемых экземпляров. Администраторы могут удалять эти экземпляры из хранилища экземпляров, если известно, что этот рабочий процесс не будет получать связанные сообщения. Например, если экземпляр находился в базе данных в течение нескольких месяцев и известно, что стандартное время существования жизненного цикла рабочего процесса составляет несколько дней, можно с уверенностью предположить, что это инициализированный экземпляр, в котором произошел сбой.
При поиске несохраняемых экземпляров в хранилище экземпляров рабочих процессов SQL можно использовать следующие 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’
Предупреждение
Не рекомендуется удалять все несохраненные экземпляры, поскольку к ним относятся экземпляры, которые были недавно созданы и которые еще не были сохранены.