作为更复杂项目的一部分,我们在工作流基础上使用我们自己的工作流持久层。
我加载了并保存了运行,但是出现了一个问题,即只能恢复无法使用的工作流程。我被困在某个地方,只是没看到在哪里。
我加载的任何工作流程都是这样加载的:
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)(本书)中的示例进行操作,它只是不起作用。
有人有想法吗?
答案 0 :(得分:2)
WF4自定义实例存储是一件非常棘手的事情,而且文档很少: - (
除了Jota提到的样本,它们有用但不是最容易上手的样本,还有一些文档here。仔细查看XmlWorkflowInstanceStore.BeginTryCommand()
以及使用if (command is SaveWorkflowCommand)
等代码检查命令的方式,最后返回new CompletedAsyncResult<bool>(true, callback, state
)