我相信当涉及到工作流引擎时,我有一个基本的误解,如果你能帮我理清的话,我会很感激。我不确定我的误解是特定于我正在使用的工作流引擎,还是一个普遍的误解。我碰巧使用了Windows Workflow Foundation (WWF)。
WWF允许您在长期运行的工作流(想想几个月甚至几年)中实现业务流程。启动时,无法更改工作流。但是,什么业务流程在任何时候都不能改变?如果业务流程发生了变化,您不希望您的软件为已经启动的业务流程的“实例”反映此更改吗?我遗漏了什么?
在WWF中,您可以通过组合一组活动来定义工作流。有不同类型的活动 --其中一些是用于流控制的,例如IfElseActivity和WhileActivty,而另一些则允许您执行实际的任务,例如CodeActivity wich允许您运行.NET代码,以及允许您调用web服务的InvokeWebServiceActivity。使用可视化设计器将活动组合到工作流中。您几乎可以从工具箱拖放活动到设计器区域,并将活动连接到彼此。工作流和活动具有输入参数、输出参数和变量。
我们有一个单一的工作流,有时运行几天,但它可能运行5-6个月。WWF负责持久化工作流状态(我们目前正在执行什么活动,变量值是什么等等)。
到目前为止,我认为WWF是有意义的。有些人更喜欢使用可视化设计器来实现业务流程的软件表示,而不是用代码编写所有这些。
我不明白的是以下几点:
WWF旨在处理长期运行的工作流.但同时,WWF没有内置功能,允许您修改正在运行的工作流。因此,如果您使用工作流对业务流程建模并运行6个月,您最好希望业务流程不会改变。因为如果是这样的话,您必须同时执行多个版本的工作流。对我来说,这似乎是一个基本的设计错误,但与此同时,我似乎更有可能误解了一些东西。
对我们来说,这已经产生了一些现实世界的影响:
我们收到了一些关于如何处理这件事的建议
我遗漏了什么?
发布于 2013-10-08 19:51:47
tl;dr:长期运行的工作流预计不会在其生命周期内发生变化。如果它们可能会改变,那么将它们分解成更小、更短的工作流,并将它们链接在一起,从而形成更大的工作流。
为什么您的计算机系统有时需要重新启动?因为你不能在使用的时候更换设备驱动程序。你怎么才能避开这一切?通过使事物不可变和编写功能风格的程序。
Erlang编程语言是专为在程序运行时升级而设计的。它是怎么做到的?通过在内存中维护不可变的函数实例。当您在Erlang中对程序进行热修补时,Erlang只需维护现有的功能实例,直到它们完成执行。函数的任何新实例都将使用该函数的新版本,而且由于函数是不可变的,因此在过渡期间可以确保稳定性。
请注意,这将无助于您的工作流,因为您仍然无法在现有工作流运行时对其进行热修补。热修补是指整个功能系统,而不是运行函数的单个实例。您的工作流(本质上是一个长期运行的函数)仍然必须先完成执行。
正如您已经指出的,对运行工作流的更改的目的是进行一些小的调整,而不是对工作流进行大量的更改。
发布于 2013-10-08 21:22:25
跟踪工作流中已经完成的工作,以及当您创建新的工作流时,跳过已经执行的活动。我觉得这个替代方案可能适用于简单的工作流,但是如果对工作流进行了主要的重构,那么自动找出跳过哪些活动就变得不容易了。
问题是,它可以变得毛茸茸的,甚至手动,以确定哪些活动可以跳过。例如,如果旧工作流中的当前活动在新工作流中没有等效的活动怎么办?所以我建议你采取一种综合策略:
https://softwareengineering.stackexchange.com/questions/213805
复制相似问题