Застрял с постоянством рабочего процесса (собственный поставщик) - PullRequest
1 голос
/ 03 ноября 2011

как часть более сложного проекта, мы работаем над нашим собственным уровнем персистентности рабочего процесса для основы рабочего процесса.

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

Любой рабочий процесс, который я загружаю, загружается так:

WorkflowApplication wf2App = new WorkflowApplication(new WorkflowInstanceStoreTestsSimplePersistence());
wf2App.InstanceStore = store;
wf2App.Load(wfApp.Id);

Это выглядит хорошо - я возвращаю рабочий процесс.Я подключаю обработчики, и когда я запускаю Run () ... я получаю ...

... Прервать.

Причина:

Ошибка обработки текущего рабочего элемента привела к прерыванию рабочего процесса.Подробности см. Во внутреннем исключении.

Внутреннее исключение:

Реализация InstanceStore поставщика сохраняемости не поддерживает команду с именем {urn: schemas-microsoft-ком: System.Activities.Persistence / команда} SaveWorkflow.Либо выберите другого поставщика, либо убедитесь, что эта команда сохранения не была выполнена.

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

Трассировка стека также не помогает:

   at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.Runtime.DurableInstancing.InstancePersistenceContext.ExecuteAsyncResult.End(IAsyncResult result)
   at System.Runtime.DurableInstancing.InstancePersistenceContext.EndOuterExecute(IAsyncResult result)
   at System.Runtime.DurableInstancing.InstanceStore.EndExecute(IAsyncResult result)
   at System.Activities.WorkflowApplication.PersistenceManager.EndSave(IAsyncResult result)
   at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.OnPersisted(IAsyncResult result)
   at System.Runtime.AsyncResult.SyncContinue(IAsyncResult result)
   at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.Persist()
   at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.CollectAndMap()
   at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.Track()
   at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.EnsureProviderReadyness()
   at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult.InitializeProvider()
   at System.Activities.WorkflowApplication.UnloadOrPersistAsyncResult..ctor(WorkflowApplication instance, TimeSpan timeout, PersistenceOperation operation, Boolean isWorkflowThread, Boolean isInternalPersist, AsyncCallback callback, Object state)
   at System.Activities.WorkflowApplication.BeginInternalPersist(PersistenceOperation operation, TimeSpan timeout, Boolean isInternalPersist, AsyncCallback callback, Object state)
   at System.Activities.WorkflowApplication.OnBeginPersist(AsyncCallback callback, Object state)
   at System.Activities.Runtime.ActivityExecutor.PersistenceWaiter.PersistWorkItem.Execute(ActivityExecutor executor, BookmarkManager bookmarkManager)

Все мои командные операции находятся в переопределении InstanceStore дляTryCommand, и он просто работает без ошибок.

Обработчик для SaveWorkflowCommand:

void Pro

cessSaveWorkflow (InstancePersistenceContext context, SaveWorkflowCommand command)
        {
            if (command.CompleteInstance)
            {
                DataStore.DeleteInstance(context.InstanceView.InstanceId);
                DataStore.DeleteInstanceAssociation(context.InstanceView.InstanceId);
                return;
            }

            if (command.InstanceData.Count > 0 || command.InstanceKeyMetadataChanges.Count > 0)
            {
                if (!DataStore.SaveAllInstanceData(context.InstanceView.InstanceId, command))
                {
                    DataStore.SaveAllInstanceMetaData(context.InstanceView.InstanceId, command);
                }
                if (command.InstanceKeysToAssociate.Count > 0)
                {
                    foreach (var entry in command.InstanceKeysToAssociate)
                    {
                        DataStore.SaveInstanceAssociation(context.InstanceView.InstanceId, entry.Key, false);
                    }
                }
                return;
            }
        }

и работает без проблем (вызовы хранилища данных, которые я не выполняюопубликуйте здесь).

Я начинаю подозревать, я могу забыть какой-нибудь вызов, чтобы установить статус ok, но я следую примерам из Pro WF (для 4.0) (книга), и он просто не работает.

У кого-нибудь есть идея?

1 Ответ

2 голосов
/ 03 ноября 2011

Хранение пользовательских экземпляров WF4 - очень сложная вещь для написания, и документации очень мало: - (

Помимо примеров, упомянутых Jota, полезных, но не самых простых для начала, естьнемного документации здесь . Внимательно посмотрите на XmlWorkflowInstanceStore.BeginTryCommand() и то, как он проверяет команду с кодом, подобным if (command is SaveWorkflowCommand), и, наконец, возвращает new CompletedAsyncResult<bool>(true, callback, state)

...