Java异步开源工作流软件

3

我有一个包含大约40个活动的系统,每个活动都调用服务或执行某些计算。这个系统是用Java编写的。目前所有这些活动都是顺序执行的,整个过程需要大约2-3秒钟。我正在尝试优化系统并尝试减少延迟。我注意到一些活动具有数据依赖性,而另一些则是独立的。我正在尝试使这些活动并行运行,同时也保持具有数据依赖性的活动的顺序。例如,假设按照以下顺序顺序执行活动'A'到'F':

A->B->C->D->E->F  (Activities)  
1   2   3   4  5  6  (Time Units)  

假设由 A 产生的数据被 E 使用,由 B 产生的数据被 F 使用,而其余的活动不依赖于任何其他数据。我可以按照以下顺序并行运行这些活动,而不是顺序运行它们:
A->E  
B->F  
C  
D  
1  2 (Time)  

因此,系统应该能够在2个时间单位内完成整个过程,而不是6个时间单位。有没有任何开源的Java框架可以用来处理这样的工作流,并且一旦数据可用就可以无缝地执行活动?

2个回答

0

这里有一个专门用于此目的的框架(称为Dexecutor),您可以参考thisthis Dzone文章以获取此用例示例。对于工作流类似的用例,请参考this

以下是使用Dexecutor的方法。

DexecutorConfig<String, String> config = new DexecutorConfig<>(executorService, new TaskProvider());
DefaultDexecutor<String, String> executor = new DefaultDexecutor<String, String>(config);

executor.addDependency("A", "E");
executor.addDependency("B", "F");
executor.addIndependent("C");
executor.addIndependent("D");

executor.execute(ExecutionConfig.NON_TERMINATING);

声明:本框架的所有权归我所有。


-1
答案取决于依赖图的拓扑结构。如果可以将其分解为独立的线性序列,就像您的示例一样,那么只需将每个序列表示为Runnable,并使用自己的线程运行它们或将它们提交到线程池中。
如果序列分支如下:
A->B->C
   |
   ->D->E

首先运行序列ABC,然后从活动B中运行DE。

最复杂的情况是当一个活动依赖于两个或更多活动时:

A->B -> |
C  ->   |->D // needs both results from B and C

您需要在图中添加一个节点,该节点收集结果并在收集所有结果后启动新的序列。如果使用线程,则可以将每个依赖关系表示为阻塞队列,并让依赖活动首先从所有输入队列中读取,使用BlockingQueue.take()方法。如果使用线程池,则可以:

  • 使用Java8 CompletableFuture类及其方法runAfterBoth(用于2个依赖项)或allOf(用于任意数量的依赖项)。

  • 使用某些数据流库(作为作者,我推荐https://github.com/rfqu/df4j

  • 自己实现连接节点,这不是什么大问题


在我看来,这很难维护。工作流引擎应该采用声明式风格而不是命令式风格。 - Master_Yoda

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