Что может быть причиной исключения DurableInstancing.InstanceNotReadyException и как я могу это исправить? - PullRequest
2 голосов
/ 11 января 2011

У нас есть бизнес-логика для управления жизненным циклом документа.
Это реализовано с использованием Workflow Foundation 4 и WF Persistence.Во время выполнения рабочего процесса определенные закладки создаются в рабочем процессе, и запланированное задание периодически находит все определенные закладки и возобновляет рабочий процесс (Выполняемое действие выполняет некоторую обработку и снова добавляет рабочий процесс в закладки, чтобы впоследствии можно было возобновить рабочий процесс.)

Теперь для некоторых запущенных экземпляров рабочего процесса мы получаем следующую ошибку:

System.Runtime.DurableInstancing.InstanceNotReadyException was unhandled
  Message=The execution of an InstancePersistenceCommand was interrupted because the instance '99ce9413-5b17-4de0-a453-46891509e032' has not yet been persisted to the instance store.
  Source=System.Runtime.DurableInstancing
  StackTrace:
       at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
       at System.Runtime.DurableInstancing.InstancePersistenceContext.OuterExecute(InstanceHandle initialInstanceHandle, InstancePersistenceCommand command, Transaction transaction, TimeSpan timeout)
       at System.Runtime.DurableInstancing.InstanceStore.Execute(InstanceHandle handle, InstancePersistenceCommand command, TimeSpan timeout)
       at System.Activities.WorkflowApplication.PersistenceManager.Load(TimeSpan timeout)
       at System.Activities.WorkflowApplication.LoadCore(TimeSpan timeout, Boolean loadAny)
       at System.Activities.WorkflowApplication.Load(Guid instanceId, TimeSpan timeout)
       at System.Activities.WorkflowApplication.Load(Guid instanceId)

ранее эти же экземпляры были успешно загружены.

У меня есть пара вопросов, связанных с этим исключением:

  • Когда мы можем получить это исключение?
  • Если мы получим это исключение, есть ли какой-нибудь изящный способ обработать его, чтобы те же экземпляры могли быть возобновлены позже?
  • Также есть ли способ исправить существующие экземпляры рабочего процесса, которые не могут быть возобновлены из-за этого исключения?

1 Ответ

1 голос
/ 15 февраля 2012

Это ваша машина разработки, на которой вы последовательно вносите изменения в рабочие процессы? Я получил эту ошибку раньше и должен был очистить свою базу данных постоянства. Вот скрипт, который сделает это за вас.

use [AppFabricPersistenceStore]

set nocount on

declare @InstanceId uniqueidentifier
declare @SurrogateInstanceId bigint

declare csr cursor fast_forward for
    select InstanceId from [System.Activities.DurableInstancing].Instances

open csr
fetch next from csr into @InstanceId

while @@fetch_status = 0
begin
    (
        select @SurrogateInstanceId = SurrogateInstanceId
        from [System.Activities.DurableInstancing].InstancesTable i
        where i.Id = @InstanceId
    )

    execute [System.Activities.DurableInstancing].DeleteInstance @SurrogateInstanceId

    fetch next from csr into @InstanceId
end

close csr
deallocate csr

Дайте мне знать, если это работает для вас!

...