首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Java编写的异步开源工作流软件

用Java编写的异步开源工作流软件
EN

Stack Overflow用户
提问于 2014-02-27 14:03:51
回答 2查看 830关注 0票数 2

我有一个包含大量活动(大约40个)的系统。每个活动要么调用一个服务,要么执行一些计算。本系统是用Java语言编写的。目前,所有这些活动都是按顺序执行的,整个过程大约需要2-3秒。我正在尝试优化系统,并尝试减少延迟。我注意到其中一些活动具有数据依赖性,并且其中一些活动是独立的。我正在尝试使这些活动并行运行,同时还维护具有数据依赖性的活动的序列。例如,假设活动'A‘到'F’按以下顺序依次执行:

代码语言:javascript
运行
复制
A->B->C->D->E->F  (Activities)  
1   2   3   4  5  6  (Time Units)  

假设A产生的数据由E使用,B产生的数据由F使用,其余的活动不依赖于任何其他数据。我应该能够按如下顺序并行运行这些活动,而不是按顺序运行这些活动:

代码语言:javascript
运行
复制
A->E  
B->F  
C  
D  
1  2 (Time)  

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

EN

回答 2

Stack Overflow用户

发布于 2016-11-08 13:25:12

这就是为此目的而设计的框架(称为Dexecutor),您可以参考thisthis Dzone文章来获取此用例示例。对于像usecase这样的工作流程,请参考this

下面是使用Dexecutor的方法。

代码语言:javascript
运行
复制
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);

免责声明:我是这个框架的所有者

票数 0
EN

Stack Overflow用户

发布于 2014-02-27 15:18:20

答案取决于依赖图的拓扑结构。如果它可以拆分成独立的线性序列,如您的示例所示,那么只需将每个序列表示为一个Runnable,并使用其自己的线程运行每个序列,或者将其提交到线程池。

如果一个序列像这样分支:

代码语言:javascript
运行
复制
A->B->C
   |
   ->D->E

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

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

代码语言:javascript
运行
复制
A->B -> |
C  ->   |->D // needs both results from B and C

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

  • 使用Java8 CompletableFuture类及其方法runAfterBoth (对于2个依赖项)或allOf (对于任意数量的连接一些数据流程库(作为作者,我建议您自己连接节点,这不是一个大问题
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22060325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档