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


Участники сохраняемости

Участник сохраняемости может участвовать в операции сохраняемости («Сохранение» или «Загрузка»), запущенной узлом приложения. Платформа .NET Framework 4.6.1 поставляется с двумя абстрактными классами PersistenceParticipant и PersistenceIOParticipant, которые можно использовать для создания участника сохраняемости. Участник сохраняемости создается как производное от одного из этих классов, реализует методы, представляющие интерес, а затем добавляет экземпляр класса в коллекцию WorkflowExtensions узла WorkflowServiceHost. Узел приложения может искать такие расширения рабочих процессов при сохранении экземпляра рабочего процесса и в нужное время вызывать соответствующие методы для участников сохраняемости.

В следующем списке описываются задачи, выполняемые подсистемой сохраняемости на разных стадиях операции сохраняемости (Сохранение). Участники сохраняемости используются на третей и четвертой стадиях. Если участник является участником ввода-вывода (участник сохраняемости, который также участвует в операциях ввода-вывода), участник также используется на шестом этапе.

  1. Собирает встроенные значения, включая состояние рабочего процесса, закладки, сопоставленные переменные и метки времени.

  2. Собирает всех участников сохраняемости, которые были добавлены в коллекцию модулей, связанных с экземпляром рабочего процесса.

  3. Вызывает метод CollectValues, реализуемый всеми участниками сохранения.

  4. Вызывает метод MapValues, реализуемый всеми участниками сохранения.

  5. Сохраняет рабочий процесс в хранилище сохраняемости.

  6. BeginOnSave Вызывает метод для всех участников операций ввода-вывода сохраняемости. Если участник не является участником ввода-вывода, эта задача пропускается. Если эпизод сохраняемости транзакционный, транзакция предоставляется в свойстве Transaction.Current.

  7. Ждет завершения работы всех участников сохраняемости. Фиксирует транзакцию, если все участники успешно сохраняют данные экземпляра.

Участник сохраняемости является производным от класса PersistenceParticipant и может реализовать методы CollectValues и MapValues . Участник сохраняемости ввода-вывода является производным от класса PersistenceIOParticipant и может реализовать метод BeginOnSave в дополнение к реализации методов CollectValues и MapValues.

Каждая следующая стадия начинается только после завершения предыдущей. Например, значения собираются со всех участников сохраняемости на первом этапе. На второй стадии все значения, собранные на первой стадии, предоставляются всем участникам сохраняемости для сопоставления. Затем все значения, собранные и сопоставленные на первой и второй стадиях, предоставляются поставщику сохраняемости на третьей стадии и так далее.

В следующем списке описываются задачи, выполняемые подсистемой сохраняемости на разных стадиях операции загрузки. Участники сохраняемости используются на четвертой стадии. Участники сохраняемости операций ввода-вывода (участники сохраняемости, которые также участвуют в операциях ввода-вывода) также используются на третьем этапе.

  1. Собирает всех участников сохраняемости, которые были добавлены в коллекцию модулей, связанных с экземпляром рабочего процесса.

  2. Загружает рабочий процесс из хранилища сохраняемости.

  3. BeginOnLoad Вызывает всех участников операций ввода-вывода сохраняемости и ожидает завершения всех участников сохраняемости. Если эпизод сохраняемости транзакционный, транзакция предоставляется в свойстве Transaction.Current.

  4. Загружает экземпляр рабочего процесса в память на основе данных, извлеченных из хранилища сохраняемости.

  5. Вызывает PublishValues на каждом участнике сохраняемости.

Участник сохраняемости является производным от класса PersistenceParticipant и может реализовать метод PublishValues . Участник сохраняемости ввода-вывода является производным от класса PersistenceIOParticipant и может реализовать метод BeginOnLoad в дополнение к реализации метода PublishValues .

При загрузке экземпляра рабочего процесса поставщик сохраняемости создает блокировку для этого экземпляра. Это не дает загружать экземпляр более чем одному узлу в конфигурации с несколькими узлами. При попытке загрузить экземпляр рабочего процесса, заблокированный, вы увидите исключение, как показано ниже: исключение "System.ServiceModel.Persistence.InstanceLockException: запрошенная операция не может завершиться, так как блокировка для экземпляра "000000000000000000000000000000000000000000000000000000" не удалось получить". Эта ошибка возникает в одной из следующих ситуаций.

  • В конфигурации с несколькими узлами экземпляр загружен другим узлом. Существует несколько способов решить конфликты этих типов: переадресовать обработку в узел (владелец блокировки) и повторить попытку либо выполнить принудительную загрузку, из-за которой другому узлу не удастся сохранить свою работу.

  • В сценарии с одним узлом, если произошел сбой узла. При повторном запуске (в результате перезапуска процесса или создания новой фабрики поставщика сохраняемости) узел пытается загрузить экземпляр, все еще заблокированный старым узлом, поскольку срок блокировки еще не истек.

  • В сценарии с одним узлом работа рассматриваемого экземпляра была в какой-то момент прервана и был создан новый экземпляр поставщика сохраняемости с другим идентификатором узла.

Значение времени ожидания блокировки по умолчанию равно 5 минутам, можно указать другое значение времени ожидания при вызове метода Load.

В этом разделе

См. также