0
点赞
收藏
分享

微信扫一扫

Easy-Flows - Java的简单愚蠢的工作流引擎



The simple, stupid workflow engine for Java


  • 源代码名称:easy-flows
  • 源代码网址:​​http://www.github.com/j-easy/easy-flows​​
  • ​​easy-flows 源代码文档​​
  • ​​easy-flows 源代码下载​​

Git URL

git://www.github.com/j-easy/easy-flows.git

Git Clone 代码到本地

git clone http://www.github.com/j-easy/easy-flows

Subversion 代码到本地

$ svn co --depth empty http://www.github.com/j-easy/easy-flows
Checked out revision 1.
$ cd repo
$ svn up trunk

最新新闻

12/03/2020:第2个版本的新增了一个 WorkContext(工作上下文信息),类似于Bus总线思路,所有节点都可以共享 WorkContext 信息。

什么是容易流?

轻松流是Java的工作流引擎。 它提供简单的api和构建块,以方便创建和运行可以组合工作流。

简单流程中的工作单元由 ​​Work​​​ 接口表示。 工作流由 ​​WorkFlow​​​ 接口表示。 轻松流提供 ​​WorkFlow​​ 接口的4实现:

Easy-Flows - Java的简单愚蠢的工作流引擎_工作流

这些是你需要知道的唯一基本流,以便开始创建简单流程的工作流。 你不需要学习复杂的符号或者概念,只是一些简单易于思考的自然 api。

它是如何工作的?

首先,让我们写一些Work:

class PrintMessageWork implements Work {

private String message;

public PrintMessageWork(String message) {
this.message = message;
}

public String getName() {
return "print message work";
}

@Override
public WorkReport call(WorkContext workContext) {
System.out.println(message);
return new DefaultWorkReport(WorkStatus.COMPLETED, workContext);
}
}

这里工作单元将给定消息打印到标准输出。 现在假设我们想创建以下工作流:

  • 打印"foo"三次
  • 然后并行打印"hello""world"
  • 如果"hello""world"都已经成功打印到控制台,则打印"ok",否则打印"nok"

这里工作流可以如下所示:

Easy-Flows - Java的简单愚蠢的工作流引擎_Data-Flow_02

  • ​flow1​​​ 是​​work1​​​的​​RepeatFlow​​,它打印"foo"三次
  • ​flow2​​​ 是​​work2​​​ 和​​work3 ​​​的​​ParallelFlow​​,它并行地打印"hello""world"
  • ​flow3​​​ 是一个​​ConditionalFlow​​​,它先执行​​flow2​​​ ( 工作流也是工作),如果​​flow2​​​ 完成,则执行​​work4​​,否则将分别打印“ok”“nok”
  • ​flow4​​​ 是一个​​SequentialFlow​​​ 它执行​​flow1​​​,然后按顺序执行​​flow3​​。

通过轻松流,可以使用以下代码段实现这里工作流:

PrintMessageWork work1 = new PrintMessageWork("foo");
PrintMessageWork work2 = new PrintMessageWork("hello");
PrintMessageWork work3 = new PrintMessageWork("world");
PrintMessageWork work4 = new PrintMessageWork("ok");
PrintMessageWork work5 = new PrintMessageWork("nok");

ExecutorService executorService = Executors.newFixedThreadPool(2);
WorkFlow workflow = aNewSequentialFlow() // flow 4
.execute(aNewRepeatFlow() // flow 1
.named("print foo 3 times")
.repeat(work1)
.times(3)
.build())
.then(aNewConditionalFlow() // flow 3
.execute(aNewParallelFlow(executorService) // flow 2
.named("print 'hello' and 'world' in parallel")
.execute(work2, work3)
.build())
.when(WorkReportPredicate.COMPLETED)
.then(work4)
.otherwise(work5)
.build())
.build();

WorkFlowEngine workFlowEngine = aNewWorkFlowEngine().build();
WorkContext workContext = new WorkContext();
WorkReport workReport = workFlowEngine.run(workflow, workContext);
executorService.shutdown();

这不是一个非常有用的工作流程,但是只是为了给你一个简单的流程编写工作流。 你可以在中找到关于所有这一切的更多细节。

为什么容易流?

由于缺少一个可以编排 Callable Java对象的简单开源工作流引擎,因这里创建了简单流程。 为什么每个工作流引擎都在尝试实现 BPMN? BPMN没有什么问题,但是它并不容易( 538页规范是什么)? )。对于 BPEL插件来说,同样的东西。

目前有好的工作流引擎,但是由于它们试图实现 BPMN,它们并不容易使用,而且常常被误用。 大多数的BPMN概念对于许多应用都不是必需的,在重引擎之上构建这样的应用程序是不有效的。

简单流程尝试提供简单的自然api替代方法,以及大多数小型/中小型应用程序的基本流。 如果你的业务流程需要一个 for,那么简单的流程可以能不是你的选择。


举报

相关推荐

0 条评论