🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
前言
首先,感谢大家对上一篇文章[业务可视化-让你的流程图"Run"起来(3.分支选择&跨语言分布式运行节点)]的支持。
下面我以实际业务场景为例,来介绍一下ladybugflow的使用方法。
酒店预定场景(传统写法)
对于下面的酒店预定流程
流程1:
流程2
[流程1]的传统写法1:
定义流程间共享变量;
开始处理();
查询客户信息处理();
查询酒店信息处理();
下单处理();
下单成功处理();
假设每个流程用3秒钟,整个流程执行完需要3*5=15秒。
于是衍生出了写法2:
定义流程间共享变量;
开始处理();
启动 查询客户信息线程处理 A;
启动 查询酒店信息线程处理 B;
等待A,B结束;
下单处理();
下单成功处理();
节省了时间,但各种多线程的实现方式使程序变得复杂,
而且上述写法都把流程图与业务逻辑进行了绑定,
也就是流程图中添加,删除节点后,相应的逻辑代码也要修改,测试范围往往是整个流程图的业务逻辑都要进行测试。
酒店预定场景(新写法)
针对上面的问题,我在设计ladybugflow的时候,把流程图和业务逻辑进行了分离,
每个业务逻辑对应一个方法,与流程图中的节点进行绑定。
这样修改流程图就不用修改业务逻辑了。
而且流程图可以通过工具拖拽方式生成,还可以在图上查看运行结果。
下面介绍一下ladybugflow中的开发过程
1. 导入依赖
Maven
<dependency>
<groupId>io.github.nobugladygroupId>
<artifactId>ladybugflowartifactId>
<version>0.0.6version>
dependency>
Gradle
// https://mvnrepository.com/artifact/io.github.nobuglady/ladybugflow
implementation 'io.github.nobuglady:ladybugflow:0.0.6'
2. 画流程图,并且生成Json文件
首先把这个文件下载到本地,用浏览器打开
https://github.com/nobuglady/ladybugflow/blob/main/html/network.html
然后点击页面上的[edit]按钮可以画流程图,
画完流程图后,点击[update json]按钮,可以生成流程图对应的json文件。
3. 写业务方法
流程图的每个节点对应下面的一个方法,用@Node注解来关联流程图。
可以用类变量进行参数传递和表示结果,比如下单成功后,设置类变量为"success"。
注:建议用节点ID进行关联,本文为了看起来方便,选择了中文的节点名称进行关联
Flow1.java(注意文件编码为UTF-8)
/**
*
* @author NoBugLady
*
*/
public class Flow1 extends FlowRunner {
private String result;
public String getResult() {
return result;
}
@Node(label = "start")
public void processStart() throws InterruptedException {
System.out.println("启动开始 (模拟业务等待3秒)");
Thread.sleep(3000);
System.out.println("启动结束");
}
@Node(label = "查询用户信息")
public void processSearchUser() throws InterruptedException {
System.out.println("查询用户信息开始 (模拟业务等待3秒)");
Thread.sleep(3000);
System.out.println("查询用户信息结束");
}
@Node(label = "查询酒店信息")
public void processSearchHotel() throws InterruptedException {
System.out.println("查询酒店信息开始 (模拟业务等待3秒)");
Thread.sleep(3000);
System.out.println("查询酒店信息结束");
}
@Node(label = "下单")
public void processOrder() throws InterruptedException {
System.out.println("下单开始 (模拟业务等待3秒)");
Thread.sleep(3000);
System.out.println("下单结束");
}
@Node(label = "下单成功")
public void processSuccess() throws InterruptedException {
System.out.println("下单成功开始 (模拟业务等待3秒)");
Thread.sleep(3000);
System.out.println("下单成功结束");
result = "success";
}
}折叠
4. 将流程图的Json文件放入工程
Flow1.json(注意文件编码为UTF-8)
{
"flowId": "your flow id",
"nodes": [
{
"id": "1",
"label": "start"
},
{
"id": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
"label": "查询用户信息",
"readyCheck": 0
},
{
"id": "1a90a997-4390-470a-ae7c-626a725438d2",
"label": "查询酒店信息",
"readyCheck": 0
},
{
"id": "52289e99-363d-4453-8077-ca8bdc6d35bf",
"label": "下单",
"readyCheck": 0
},
{
"id": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2",
"label": "下单成功",
"readyCheck": 0
}
],
"edges": [
{
"id": "1",
"from": "1",
"to": "2",
"arrows": "to"
},
{
"id": "b3ad7ab3-8fb6-4527-8cae-6845e03da3e4",
"from": "1",
"to": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
"arrows": "to"
},
{
"id": "001375c7-19e7-436b-bbcd-68e36c8f23b7",
"from": "1",
"to": "1a90a997-4390-470a-ae7c-626a725438d2",
"arrows": "to"
},
{
"id": "dd830043-c7a7-4c71-b91c-10c007b7b19c",
"from": "1a90a997-4390-470a-ae7c-626a725438d2",
"to": "52289e99-363d-4453-8077-ca8bdc6d35bf",
"arrows": "to"
},
{
"id": "21c2c69d-0050-4eca-8283-5a2bcbdc6c37",
"from": "52289e99-363d-4453-8077-ca8bdc6d35bf",
"to": "16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2",
"arrows": "to"
},
{
"id": "19f2f329-8163-4dc6-a353-800df79d18a6",
"from": "a1a38c2e-0e05-4c68-bd49-f12aea070876",
"to": "52289e99-363d-4453-8077-ca8bdc6d35bf",
"arrows": "to"
}
]
}折叠
项目结构如下图所示
Flow1.java和Flow1.json需要放到同一个包下。
5. 启动流程
App1.java(注意文件编码为UTF-8)
/**
*
* @author NoBugLady
*
*/
public class App1 {
public static void main(String[] args) {
Flow1 testFlow = new Flow1();
testFlow.startFlow(true);
System.out.println(testFlow.getResult());
// 不建议每次都调用shutdown,可以在整个App关闭的时候调用一次shutdown
FlowStarter.shutdown();
}
}
6. 查看运行结果
[I]2022/07/27 21:23:12.172 main:ladybugflow.properties in root path not found, use default configuration
[I]2022/07/27 21:23:12.177 main:NodePool started.
[I]2022/07/27 21:23:12.178 main:Ready queue consumer thread started.
[I]2022/07/27 21:23:12.180 main:Complete queue consumer thread started.
[I]2022/07/27 21:23:12.993 [your flow id][38f3567d-77fb-4629-bf7e-68b27633ed68] main:json:
{"flowId":"your flow id","nodes":[{"id":"1","label":"start","readyCheck":0},{"id":"a1a38c2e-0e05-4c68-bd49-f12aea070876","label":"查询用户信息","readyCheck":0},{"id":"1a90a997-4390-470a-ae7c-626a725438d2","label":"查询酒店信息","readyCheck":0},{"id":"52289e99-363d-4453-8077-ca8bdc6d35bf","label":"下单","readyCheck":0},{"id":"16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","label":"下单成功","readyCheck":0}],"edges":[{"id":"1","from":"1","to":"2","condition":null,"arrows":"to"},{"id":"b3ad7ab3-8fb6-4527-8cae-6845e03da3e4","from":"1","to":"a1a38c2e-0e05-4c68-bd49-f12aea070876","condition":null,"arrows":"to"},{"id":"001375c7-19e7-436b-bbcd-68e36c8f23b7","from":"1","to":"1a90a997-4390-470a-ae7c-626a725438d2","condition":null,"arrows":"to"},{"id":"dd830043-c7a7-4c71-b91c-10c007b7b19c","from":"1a90a997-4390-470a-ae7c-626a725438d2","to":"52289e99-363d-4453-8077-ca8bdc6d35bf","condition":null,"arrows":"to"},{"id":"21c2c69d-0050-4eca-8283-5a2bcbdc6c37","from":"52289e99-363d-4453-8077-ca8bdc6d35bf","to":"16422cbb-ccb0-4fe2-952b-e3ad5c3acbb2","condition":null,"arrows":"to"},{"id":"19f2f329-8163-4dc6-a353-800df79d18a6","from":"a1a38c2e-0e05-4c68