坚持工作流持久性(自己的提供者)

时间:2011-11-03 13:54:21

标签: workflow-foundation-4

作为更复杂项目的一部分,我们在工作流基础上使用我们自己的工作流持久层。

我加载了并保存了运行,但是出现了一个问题,即只能恢复无法使用的工作流程。我被困在某个地方,只是没看到在哪里。

我加载的任何工作流程都是这样加载的:

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

这看起来不错 - 我得到了一个工作流程。我联系处理程序,当我做Run()时......我得到......

...中止。

原因是:

  

处理当前工作项的错误导致工作流程中止。见   细节的内在例外。

内部例外是:

  

InstanceStore的持久性提供程序实现不支持该命令   named {urn:schemas-microsoft-com:System.Activities.Persistence / command} 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)

我的所有命令操作都在TryCommand的InstanceStore覆盖中,并且只能正常工作。

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(for 4.0)(本书)中的示例进行操作,它只是不起作用。

有人有想法吗?

1 个答案:

答案 0 :(得分:2)

WF4自定义实例存储是一件非常棘手的事情,而且文档很少: - (

除了Jota提到的样本,它们有用但不是最容易上手的样本,还有一些文档here。仔细查看XmlWorkflowInstanceStore.BeginTryCommand()以及使用if (command is SaveWorkflowCommand)等代码检查命令的方式,最后返回new CompletedAsyncResult<bool>(true, callback, state