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