我正在评估Workflow Foundation 4或4.5,并且想知道如何在服务器重启时从实例存储中加载带有多个工作流定义的可运行实例?
“使用InstanceStore.WaitForEvents时,如果任何实例准备就绪,则会引发HasRunnableWorkflowEvent事件。而且,要调用WorkflowApplication.LoadRunnableInstance(),我们需要创建一个新的WorkflowApplication,它需要正确的工作流程定义。只有1个工作流实现时很容易。但是,如果有多个类型的工作流与同一个InstanceStore相关联,并且因为HasRunnableWorkflowEvent在将由LoadRunnableInstance()加载的就绪实例上没有任何其他信息,我们可以我们不知道我们必须为新的WorkflowApplication创建什么类型的实例。“
但答案表明:
唯一的方法是在使用WorkflowApplication托管时为每个工作流定义设置单独的实例存储。
我错过了什么吗?
答案 0 :(得分:2)
您可以在单个商店中拥有多种工作流程定义,但需要跟踪用于启动工作流程的工作流程定义。这是你的问题。在我目前的项目中,我们使用以下方法解决了这个问题。
我们在WorkflowApplication类周围使用包装类,并使用它来启动工作流。在这个包装器中,在我们实际启动工作流之前,我们在数据库的表中编写WorkflowInstance记录,在该表中存储即将运行的eorkflow的定义。除了其他一些信息,我们还有一个'persisted-id'列,它是WorkflowApplication对象生成的id。我们在启动工作流程时不知道此ID,因此我们将此列留空。当持久存在正在运行的工作流实例时(可以通过处理WorkflowApplication对象上的事件来通知您),您可以检索WorkflowApplication对象生成的id。使用persisted-id更新WorkflowInstance,并在服务器重新启动时重新加载工作流时,您可以使用id来检索工作流定义。
希望这会有所帮助。像这里的魅力一样。