这似乎是一个基本问题,但我在任何地方都找不到答案:
我有几种不同类型的长时间运行的状态机工作流程,我正在使用中央数据库跨多个主机应用程序处理这些工作流程。我正在使用 SqlWorkflowPersistenceService 来保存它们。假设我有三种工作流类型 WorkflowOne、WorkflowTwo 和 WorkflowThree。其中每个实例都由一个用户启动并保存到数据库中。另一个用户出现并想要进行各种更改,因此他们启动了该应用程序。现在我可以使用持久性服务为我提供所有持久化实例的列表,但我如何知道哪个是 WorkflowOne 类型,哪个是 WorkflowTwo 或 WorkflowThree?
最佳答案
有几种方法可以做到这一点。
第一个选项是使用 WorkflowPersistenceService 本身并执行以下操作:
var persistenceService = new SqlWorkflowPersistenceService("<<connection string>>");
var persistedWorkflows = persistenceService.GetAllWorkflows();
foreach (var persistedWorkflow in persistedWorkflows)
{
var workflowInstance = workflowRuntime.GetWorkflow(persistedWorkflow.WorkflowInstanceId);
var workflowDefinition = workflowInstance.GetWorkflowDefinition();
Console.WriteLine(workflowDefinition.GetType().FullName);
}
很容易做到,因为您已经在使用 SqlWorkflowPersistenceService,但它的缺点是必须将所有工作流实例加载到内存中,并且您负责将它们从内存中删除。
第二个选项是使用工作流跟踪:
var trackingQuery = new SqlTrackingQuery("<<connection string>>");
var queryOptions = new SqlTrackingQueryOptions()
{
WorkflowStatus = WorkflowStatus.Running
};
var runningWorkflows = trackingQuery.GetWorkflows(queryOptions);
foreach (var runningWorkflow in runningWorkflows)
{
Console.WriteLine(runningWorkflow.WorkflowType);
}
优点是您不需要将实际的工作流定义加载到内存中只是为了检查它的类型。缺点是您必须添加 SqlTrackingService 以及它自己的数据库,这增加了复杂性和开销。
关于多个工作流程的工作流程持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1296002/