Поделиться через


Как обращаться с запросом к несохраняемым экземплярам

Данный раздел относится к версии 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, так как этот набор экземпляров содержит и только что созданные, но еще не материализованные экземпляры. Следует удалять только нематериализованные экземпляры, которые остались неиспользованными, так как в самом экземпляре или в узле службы рабочего процесса, в котором был загружен экземпляр, произошло исключение.

Ee960214.Warning(ru-ru,VS.100).gif Внимание!
Удаление нематериализованных экземпляров из хранилища экземпляров уменьшает размер хранилища и может повысить производительность операций с хранилищем.