我需要在 .net 中构建一个动态工作流应用程序,它基本上允许创建、监视、暂停、重新启动、持久化和动态更新工作流。工作流的每个节点都是一项高要求的计算任务,可能需要几个小时,并且工作流将由至少 20 个节点组成。
目前,似乎最好的解决方案是使用 WF4,但环顾四周,我发现 F#、Orleans 或 Akka.NET 中的基于代理的编程对于实现工作流解决方案非常有吸引力,与 WF4 相比,没有那么多水电学习。使用基于代理的编程开始解决方案是个好主意,还是应该继续使用 WF4?
我需要在 .net 中构建一个动态工作流应用程序,它基本上允许创建、监视、暂停、重新启动、持久化和动态更新工作流。工作流的每个节点都是一项高要求的计算任务,可能需要几个小时,并且工作流将由至少 20 个节点组成。
目前,似乎最好的解决方案是使用 WF4,但环顾四周,我发现 F#、Orleans 或 Akka.NET 中的基于代理的编程对于实现工作流解决方案非常有吸引力,与 WF4 相比,没有那么多水电学习。使用基于代理的编程开始解决方案是个好主意,还是应该继续使用 WF4?
<edit>
要回答您关于构建基于代理的模型的问题,我认为这是最好的方法。它也使调试和维护更容易,同时分离出整个操作的“驱动程序”(即您可以换掉WF并用另一个设备替换它)。
</edit>
WF4 可用于驱动您长期运行的业务逻辑。我使用过的最好的方法是简单地启动“代理进程”的工作流,当代理工作时,WF 实例休眠等待被代理唤醒。
简而言之,类似这种方法:
编排过程
这个过程负责启动一个全新的工作流实例。您的工作流程将简单地启动一个代理流程来完成实际工作。然后工作流实例将休眠。
此过程还将等待恢复休眠工作流实例的请求。本质上,工作流实例只会“运行”片刻,并将实际工作委托给其他线程/进程。
实现编排过程的一种方法是作为 Web 服务。它使代理进程可以轻松地在代理完成时回调它以唤醒沉睡的工作流实例。
代理过程
这个过程将具有执行工作的实际知识。当编排流程调用时,会向其提供一些信息以了解它应该针对哪个上下文(即业务对象)执行。当它完成时,代理通知编排过程它完成了。
返回编排流程
当代理完成其任务时,它会回调编排流程,表明上下文已准备好移动到流程中的下一个项目。然后,编排过程将水合该上下文的工作流程,并恢复它。
工作流可以决定接下来要启动另一个长时间运行的任务,从而启动另一个代理进程来委派任务,然后再次休眠工作流实例。这个循环一直持续到工作流实例结束。
“动态”工作流程部分
我认为您指的是更新“正在进行中”的工作流程,对吗?如果是这样,WF4.5 有能力允许这样做。我(还)从未实现过它,但从我读过的内容来看它是可行的。
该概念涉及添加一些有关正在执行的工作流版本的元数据。WF 将负责启动动态活动更新,您可以控制它进行协调。