Java中的异步开源工作流软件

时间:2014-02-27 06:03:51

标签: java asynchronous workflow pipeline

我的系统有很多活动(大约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 :(得分:0)

以下是完全用于此目的的框架(称为Dexecutor),您可以参考此{} thisthis Dzone文章以了解此用例示例。对于像usecase这样的工作流程,请参考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 :(得分:-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

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