2011-01-13 4 views
0

У меня есть рабочий процесс, который запускается и сохраняется с помощью операций обмена сообщениями. Корреляция между начальной командой Start и командой окончательной остановки работает хорошо, если они отправлены в течение нескольких секунд. Проблемы начинаются тогда, когда рабочий процесс выгружается, так как следующий Stop сообщение выдает следующее FaultException:Ошибка при загрузке непрерывного рабочего процесса

Если LoadWorkflowByInstanceKeyCommand.AssociateLookupKeyToInstanceId не указан, то LookupInstanceKey уже должен быть связан с экземпляром, или LoadWorkflowByInstanceKeyCommand подведет. По этой причине недействительно также указать LookupInstanceKey в коллекции InstanceKeysToAssociate, если AssociateLookupKeyToInstanceId не установлен

Может ли кто-нибудь мне помочь? Переменные внутри рабочего процесса имеют типы int и XDocument. Это код для инициализации WorkflowServiceHost:

WorkflowServiceHost serviceHost = new WorkflowServiceHost(myWorkflow, new Uri(serviceUri)); 
      ServiceDebugBehavior debug = serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>(); 
      if (debug == null) 
      { 
       debug = new ServiceDebugBehavior(); 
       serviceHost.Description.Behaviors.Add(debug); 
      } 

      debug.IncludeExceptionDetailInFaults = true; 
      WorkflowIdleBehavior idle = serviceHost.Description.Behaviors.Find<WorkflowIdleBehavior>(); 
      if (idle == null) 
      { 
       idle = new WorkflowIdleBehavior(); 
       serviceHost.Description.Behaviors.Add(idle); 
      } 

      idle.TimeToPersist = TimeSpan.FromSeconds(2); 
      idle.TimeToUnload = TimeSpan.FromSeconds(10); 
      var behavior = new SqlWorkflowInstanceStoreBehavior 
      { 
       ConnectionString = ConfigurationManager.ConnectionStrings["WorkflowPersistence"].ConnectionString, 
       InstanceEncodingOption = InstanceEncodingOption.None, 
       InstanceCompletionAction = InstanceCompletionAction.DeleteAll, 
       InstanceLockedExceptionAction = InstanceLockedExceptionAction.BasicRetry, 
       HostLockRenewalPeriod = new TimeSpan(00, 00, 30), 
       RunnableInstancesDetectionPeriod = new TimeSpan(00, 00, 05) 
      }; 
      serviceHost.Description.Behaviors.Add(behavior); 
      serviceHost.Open(); 

Глядя на базу данных, кажется, что рабочий процесс никогда не приостанавливается.

Любая помощь приветствуется, спасибо

ответ

0

Не совсем уверен, что здесь происходит, но это звучит как есть типы, используемые в рабочий процесс, который не может быть сериализованы и предотвратить рабочий процесс от хранится на диске. Когда вы говорите: «Глядя на базу данных, кажется, что рабочий процесс никогда не приостанавливается». Вы действительно имеете в виду приостановленное? И почему вы ожидаете приостановления рабочего процесса?

Что произойдет, если вы отправите только начальное сообщение в рабочий процесс и подождите 2 секунды? Получаете ли вы новую запись в базе данных сохранения?

+0

Для приостановленного я имею в виду, что он переходит в таблицу RunnableInstancesTable, а значение IsSuspended равно 1 в таблице InstancesTable. Рабочий процесс может быть сериализован, потому что, если я добавлю задержку, он будет правильно приостановлен. Проблема заключается в том, что после завершения WorkflowIdleBehavior.TimeToUnload рабочий процесс не приостанавливается, и вызов операции Stop вызывает указанную ошибку. Ошибка не возникает, если я отправляю операцию Stop до тайм-аута TimeToUnload. Это длинный рабочий процесс. – fra

+0

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

+0

Сохраненный рабочий процесс хранится в таблице InstancesTable, RunnableInstancesTable используется для восстановления рабочих процессов не тогда, когда все работает нормально. Обычно, когда рабочий процесс сохраняется, он не приостанавливается, приостановка является результатом ошибки, когда для политики установлено значение AbandonAndSuspend. Это означает, что рабочий процесс не возобновится автоматически, но его необходимо возобновить вручную. – Maurice

Смежные вопросы