⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 juejin.cn/post/7579476335556886563 「老青蛙」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

Easy Work 是什么?

Easy Work 是一个用于 Java 的工作流引擎。它提供了简洁的 API 和 构建模块,便于创建和运行可组合的工作流。

在Easy Work中,工作单元由Work接口表示,工作流则由WorkFlow接口表示。Easy Work 提供了 WorkFlow 接口的6种实现方式。

这些是使用Easy Work创建工作流时所需了解的唯一基本流程。

你无需学习复杂的符号或概念,只需掌握几个易于理解的自然API即可。

如何使用 ?

首先,让我们创建一个 Work:

public class PrintMessageWork implements Work {

privatefinal String message;

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

@Override
public String execute(WorkContext workContext) {
System.out.println(message);
return message;
}
}

此 Work 将指定消息打印至标准输出。现在假设我们想要创建如下工作流程:

  1. 打印 a 三次
  2. 顺序打印 b c d
  3. 并行执行 e f
  4. 如果并行执行的结果成功,执行 g, 否则执行 h
  5. 最后执行 z

此工作流程说明如下:

  • flow1 是一个 打印 a 的 RepeatFlow,连续执行三次
  • flow2 是一个 依次打印 b c d 的 SequentialFlow, 按照顺序依次执行
  • flow3 是一个 并行打印 e f 的 ParallelFlow, 同时执行
  • flow4 是一个 基于条件判断的 ConditionalFlow,首先执行flow3,如果执行成功(状态为 COMPLETE)则执行 g,否则执行 h
  • flow5 是一个 顺序执行流程 SequentialFlow,保证 顺序执行 flow1 flow2 flow4,最后执行 z

使用Easy Work,此工作流可以通过以下代码段实现:

PrintMessageWork a = new PrintMessageWork("a");
PrintMessageWork b = new PrintMessageWork("b");
PrintMessageWork c = new PrintMessageWork("c");
PrintMessageWork d = new PrintMessageWork("d");
PrintMessageWork e = new PrintMessageWork("e");
PrintMessageWork f = new PrintMessageWork("f");
PrintMessageWork g = new PrintMessageWork("g");
PrintMessageWork h = new PrintMessageWork("h");
PrintMessageWork z = new PrintMessageWork("z");

WorkFlow flow = aNewSequentialFlow(
aNewRepeatFlow(a).times(3),
aNewSequentialFlow(b,c,d),
aNewConditionalFlow(
aNewParallelFlow(e,f).withAutoShutDown(true)
).when(
WorkReportPredicate.COMPLETED,
g,
h
),
z
);
aNewWorkFlowEngine().run(flow, new WorkContext());

暂停工作流

从 v1.0.5开始 EasyWork工作流支持 断点, 通过断点 你可以暂停执行工作流,做一些其他事情然后恢复执行工作流。

你可以在工作流的任何位置配置断点。

例如,你可以将断点设置在c工作单元上,然后恢复执行。

此工作流说明如下:

此工作流可以通过以下代码段实现:

SequentialFlow flow = aNewSequentialFlow(
aNewRepeatFlow(a).times(3),
aNewSequentialFlow(b,aNamePointWork(c).point("C_BREAK_POINT"),d),
aNewConditionalFlow(
aNewParallelFlow(e,f).withAutoShutDown(true)
).when(
WorkReportPredicate.COMPLETED,
g,
h
),
z
);
//执行到改断点并暂停
flow.execute("C_BREAK_POINT");
System.out.println("execute to the break point `C_BREAK_POINT`");
//从断点处继续执行,直到完成
flow.execute();

JSON构建工作流

从 V1.0.8开始 EasyWork工作流支持基于 JSON 的构建,你可以通过 JSON 的方式构建任意复杂的工作流。 基于以上图示中的例子,通过 JSON 构建工作流的片段为(example.json):

{
"type": "sequential",
"works": [{
"type": "repeat",
"times": 3,
"work": {
"type": "work.PrintMessageWork",
"message": "a"
}
},{
"type": "sequential",
"works": [{
"type": "work.PrintMessageWork",
"message": "b"
},{
"type": "work.PrintMessageWork",
"message": "c"
},{
"type": "work.PrintMessageWork",
"message": "d"
}]
},{
"type": "conditional",
"decide": {
"type": "parallel",
"autoShutdown": true,
"works": [{
"type": "work.PrintMessageWork",
"message": "e"
},{
"type": "work.PrintMessageWork",
"message": "f"
}]
},
"predicate": {
"left" : "$status",
"operator": "eq",
"right": "COMPLETED"
},
"trueWork": {
"type": "work.PrintMessageWork",
"message": "g"
},
"falseWork": {
"type": "work.PrintMessageWork",
"message": "h"
}
}],
"then": {
"type": "work.PrintMessageWork",
"message": "z"
}
}

你可以通过以下代码反序列化工作流,并进行执行(更多例子请参考test/java/DeserializeTest)

String json = ResourceReader.readJSON("json/example.json");
SequentialFlow sequentialFlow = (SequentialFlow) deserialize(json);
sequentialFlow.execute(new WorkContext());

这不是一个非常有用的工作流,只是为了让你了解如何使用Easy Work而编写工作流。

你可以在 test/java 中 查看更多的测试用例。

开源地址:

https://gitee.com/ifrog/easy-work

文章目录
  1. 1. Easy Work 是什么?
  2. 2. 如何使用 ?
  3. 3. 暂停工作流
  4. 4. JSON构建工作流