Как обращаться с запросом к несохраняемым экземплярам
Данный раздел относится к версии Windows Workflow Foundation 4.
Когда новый экземпляр службы создан и для службы определено поведение хранилища экземпляров рабочих процессов SQL, узел службы создает начальную запись для экземпляра службы в хранилище экземпляров. Позднее, когда экземпляр службы материализуется в первый раз, поведение хранилища экземпляров рабочих процессов SQL сохраняет текущее состояние экземпляра вместе с дополнительными данными, необходимыми для его активации, восстановления и управления.
Если экземпляр не материализован после создания начальной записи для экземпляра, считается, что экземпляр службы находится в нематериализованном состоянии. Ко всем материализованным экземплярам службы можно выполнять запросы и управлять ими. К нематериализованным экземплярам службы нельзя выполнять запросы, управление ими также невозможно. Если нематериализованный экземпляр приостановлен из-за необработанного исключения, к нему можно выполнять запросы, но им нельзя управлять.
Экземпляры устойчивой службы, которые еще не материализованы, остаются в нематериализованном состоянии в следующих ситуациях.
Сбой узла службы происходит до первой материализации экземпляра. Начальная запись для экземпляра остается в хранилище экземпляров. Экземпляр не может быть восстановлен. Если поступает коррелированное сообщение, экземпляр вновь становится активным.
Необработанное исключение для экземпляра происходит до первой материализации экземпляра. Возникают следующие ситуации.
Если свойству UnhandledExceptionAction присваивается значение Abandon, сведения о развертывании службы записываются в хранилище экземпляров и экземпляр выгружается из памяти. Экземпляр остается в нематериализованном состоянии в базе данных сохраняемости.
Если свойству UnhandledExceptionAction присваивается значение AbandonAndSuspsend, то сведения о развертывании службы записываются в базу данных сохраняемости и состояние экземпляров устанавливается в значение Suspended. Экземпляр нельзя возобновить, отменить или завершить. Узел службы не может загрузить экземпляр, так как экземпляр еще не материализован, поэтому запись в базе данных для экземпляра не завершена (не полна).
Если свойству UnhandledExceptionAction присваивается значение Cancel или Terminate, сведения о развертывании службы записываются в хранилище экземпляров, а состояние экземпляра устанавливается в значение Completed.
В следующих разделах представлены образцы запросов для поиска нематериализованных экземпляров в базе данных сохраняемости SQL и удаления этих экземпляров из базы данных.
Обнаружение всех еще не материализованных экземпляров
Следующий SQL-запрос возвращает идентификатор (ID) и время создания для всех экземпляров, которые еще не материализованы в базе данных сохраняемости.
select InstanceId, CreationTime from [System.Activities.DurableInstancing].[Instances] where IsInitialized = 0;
Обнаружение всех экземпляров, которые еще не материализованы и не загружены
Следующий SQL-запрос возвращает идентификатор (ID) и время создания для всех экземпляров, которые не материализованы и не загружены.
select InstanceId, CreationTime from [System.Activities.DurableInstancing].[Instances] where IsInitialized = 0 and CurrentMachine is NULL;
Обнаружение всех приостановленных, но еще не материализованных экземпляров
Следующий SQL-запрос возвращает идентификатор (ID), время создания, причину приостановки и имя исключения приостановки для всех экземпляров, которые не материализованы и находятся в приостановленном состоянии.
select InstanceId, CreationTime, SuspensionReason, SuspensionExceptionName from [System.Activities.DurableInstancing].[Instances] where IsInitialized = 0 and IsSuspended = 1;
Удаление нематериализованных экземпляров из базы данных сохраняемости
Необходимо периодически проверять хранилище экземпляров на наличие нематериализованных экземпляров и удалять экземпляры из хранилища экземпляров, если можно быть уверенным, что экземпляр не получит коррелированного сообщения. Например, если экземпляр находился в базе данных в течение нескольких месяцев, а известно, что обычная продолжительность существования рабочего процесса составляет несколько дней, можно с уверенностью предположить, что это неинициализированный экземпляр, в котором произошел сбой.
Как правило, нематериализованные экземпляры, которые не приостановлены или не загружены, можно удалять без осложнений. Не следует удалять нематериализованные экземпляры all, так как этот набор экземпляров содержит и только что созданные, но еще не материализованные экземпляры. Следует удалять только нематериализованные экземпляры, которые остались неиспользованными, так как в самом экземпляре или в узле службы рабочего процесса, в котором был загружен экземпляр, произошло исключение.
![]() |
---|
Удаление нематериализованных экземпляров из хранилища экземпляров уменьшает размер хранилища и может повысить производительность операций с хранилищем. |