Java“工作流”设计

6
我想请问有关“工作流合并”的设计。我有几个工作流,它们彼此不太相似。但是,有时我想将它们组合在一起,并进行微小的修改。
让我举个例子:
工作流1 - 旅行 A1(收拾行李)-> A2(离开房子)-> A3(赶公交车)-> A4...
工作流2 - 每日植物浇水 B1(打开水龙头)-> B2(离开房子)-> B3(浇水)-> B4(进入房子)-> B5(关闭水龙头)
星期天,我想去旅行,也需要浇水。所以我想创建类似于“A1-> B1至B5-> A2…”的东西。我还想告诉我的朋友完成浇水,这将是类似于“A1-> B1到B2-> C1(将任务传递给朋友)-> A3”之类的东西。
正如您所看到的,流程很简单 - 没有分叉和汇聚,并且我不需要这样的功能。我所需要的就是创建一个命令的线性列表,并可以轻松地将它们合并在一起。目前,所有代码片段都是Java方法(我想将它们变成类似于原子流的东西)。
我的方法的主要目标应该是避免一遍又一遍地输入相同的代码。流程可能有数百个步骤。我想发出类似于“执行流A,但不要运行A2和A3,而是执行B2到B6并继续进行A”的语句。
我的两个主要问题是:
1.是否有任何已支持此功能的框架?如果有,对于我的目的来说是否过于复杂?
2.如果没有,实现这样的东西的最佳方法是什么?
注意:您能否请指明我的问题哪里不够清楚?

1
我会使用Java集合中的List来构建更多的任务列表。 - Peter Lawrey
1
又一个被关闭的好问题!如果这样继续下去,我们会没有好问题可回答了 ;) - Chetan Kinger
@CKing 投票以重新开放。 - user253751
@immibis 我试过了,看起来似乎成功了 :) - Chetan Kinger
1
我发现这个类似问题的答案非常有用: https://dev59.com/j3TYa4cB1Zd3GeqPzNSS#17844527 - Garfield
显示剩余2条评论
4个回答

1

我个人认为,这个需求可以在不使用任何特定框架的情况下实现。您可以按照以下方式设计应用程序:

  1. TaskPerformer:一个带有 performTask 方法的接口。代表要执行的任务。

  2. BagPackTask:实现 TaskPerformer 的具体类。还定义了 performTask 方法,其中包含打包行李的代码。

  3. WaterPlantsTask:另一个实现 TaskPerformer 的具体类。还定义了 performTask 方法,其中包含浇水植物的代码。同样,每个任务都有一个实现 Taskperformer 的类,并使用 performTask 方法定义任务的行为。

  4. Workflow:用于执行两个或多个任务并允许您混合和匹配现有任务的类。该类将包含一个 TaskPerformer 列表,此类的构造函数将具有 List 参数以请求要执行的任务。该类将包含一个 executeWorkflow 方法,该方法将迭代列表并调用列表中每个元素的 performTask 方法。换句话说,可以使用该类通过使用其 executeWorkflow 方法来执行在实例化期间传递给其构造函数的所有任务。重要的是要注意,您插入元素的顺序就是执行任务的顺序。

采用这种方法,您可以消除任何if-else条件来确定要执行的任务的需要。您可以在任意数量的工作流实例中重复使用TaskPerformer实现。您将获得一个超级干净的设计。如果您需要任何澄清,请告诉我,因为我认为这个设计应该解决您的问题。在接受任何答案之前,澄清所有疑问是一个好主意 :)

1

...或者实现命令模式。这应该很容易,不需要任何框架。


0

Spring Batch非常容易上手,让您提交按您选择的任何顺序运行任务的作业。我建议您从这里开始,看看它是否符合您的需求。对于您的情况,我建议您使用内存数据库(如HSQLDB)运行它,以避免设置开销。您始终可以将作业结果记录在日志文件中。

可能最成熟、最企业级的工作流引擎是JBPM,但对于您需要做的事情来说,似乎有点过重了。


感谢您的回答。据我对Spring Batch的简要概述,它允许我运行我的A、B和C,并对它们进行命名。我更喜欢像“取A工作流,将A50到A55替换为B6到B90,将B70到B75替换为C5到C20并运行它”这样的方式。我想避免一遍又一遍地输入所有这些内容。 - Danstahr
嗯,这真的取决于你如何构建你的工作定义。你可以有一个基本的工作文件,并覆盖任何你喜欢的内容。因此,你可以很容易地编写一些代码,比如说“采取'浇花'工作流程,但将'走到花坛'步骤替换为'走到花盆'”。如果你想要更高级的功能,你可以使用像Velocity这样的模板系统。那么,你想要什么样的界面呢? - Paul Sanwald

0

看一下OSWorkflow,它非常好用、轻量级,并且为你提供了所有的FSM机制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接