Turbo是一款轻量级流程引擎服务框架,可通过插件与LogicFlow完美结合,可用于流程设计、服务编排等场景需求,简单易学,可快速上手
- turbo地址:github.com/didi/turbo
- 插件地址:https://github.com/Logic-Flow/turbo-client
- 示例工程:juejin.cn/post/730927...
前言
在使用Turbo的时候,你是否也有这种困惑?
- 业务和Turbo应该怎么关联起来?
- 在每个节点执行完成后做一些事情,要怎么做?
- Turbo没有ServiceTask,如果我想让系统自动执行某些任务,应该怎么办?
目标
通过几个场景的应用场景,说明如何在也里使用turbo
难度
简单
认识Turbo
其实在解决这些问题前,我们还是需要了解一下Turbo和业务层的关系:
- Turbo是以SDK的形式提供了流程定义和驱动能力,他和业务层是分开的;
- 业务层的数据和流程引擎的执行数据同样是分开的,可以是一个库,也可以是不同库;
另外,我们再了解一下它的执行过程:

流程里的UserTask,用于挂起流程,把执行操作进行中断,交给调用方来进行处理;
那调用方应该怎么处理呢?这时候就要依赖于两点:
- 配置在流程图中,节点的属性:properties;
- 流程执行返回的数据;
举个栗子
问题一:业务和Turbo应该怎么关联起来?
- 在流程图配置时,在节点UserTask-A的properties中添加了配置:
json
{
"propertiest":{
"formKey":"test_abc",
"formVersion":1
}
}
- 流程执行到节点UserTask-A时,流程挂起,返回节点数据为:
json
{
"data":{
"flowDeployId":"c4201ef9-928c-11ee-afd1-6e24f1631864",
"flowModuleId":"404093c0-928a-11ee-83e5-6e24f1631864",
"flowInstanceId":"823320a4-9a4a-11ee-8f8a-067cbef7eabd",
"status":2,
"activeTaskInstance":{
"modelKey":"Activity_08uqvdr",
"modelName":"Task 1",
"properties":{
"name":"Task 1",
"formKey":"test_abc",
"formVersion":1,
"x":620,
"y":280,
"text":{
"x":620,
"y":280,
"value":"Task 1"
}
},
"status":2,
"nodeInstanceId":"823cbd97-9a4a-11ee-8f8a-067cbef7eabd",
"instanceDataId":"82396235-9a4a-11ee-8f8a-067cbef7eabd",
"flowElementType":4
},
"variables":[
{
"key":"now_time",
"type":"string",
"value":"2023-12-14 14:35:53"
},
{
"key":"opt",
"type":"string",
"value":"test"
}
]
},
"errCode":0,
"errMsg":"success"
}
我们可以看到当前激活节点(activeTaskInstance)下的 properties 和 变量参数(variables)。
下面我可以根据这些数据进行处理,利用当前的formKey 和 formVersion,我们去查询 保存 form的表单库表,得到表单详情,交由前端进行渲染;其中variables可以作为参数,同时交给前端,用于表单渲染;如下图

问题二:在每个节点执行完成后做一些事情,要怎么做??
通常我们会想,是不是每个节点执行完后,会自动调用某些hook方法,或者有监听器,用于在任务节点处理完成后,来处理一些事情。然而当前Turbo并没有这样的实现。
在问题一中,其实我们已经了解到,在UserTask之后,我们可以去做一些业务相关的事情。而在Turbo中,目前(v1.1.1)仅支持开始、结束、用户任务节点和排他网关判断节点,这种情况下,只有用户节点执行完后,需要处理一些事情,而每次执行到用户节点时,都是跟业务系统有交互的。所以我们可以再 Turbo 响应之后,或者在commitTask之前去完成这些事情。

问题三:Turbo没有ServiceTask,如果我想让系统自动执行某些任务,应该怎么办?
ServiceTask 是引擎中自动执行某些操作的,但Turbo暂时舍弃了这个节点的实现,为什么呢?因为系统任务的执行,要么Turbo自身维护一套"执行任务的代码",要么交给业务层来实现。而turbo为了轻量化,将这一部分交给了使用方,即在业务层去实现。当然,也有做的不好的地方,比如这不太符合大家常规的思维方式,认为ServiceTask就应该是引擎的一部分。
那么我们该怎么在业务层实现呢?
因为UserTask起到了中断的作用,properties有增加了扩展属性。因此我们可以利用UserTask和它的properties 扩展一个"ServiceTask"。
- 定义用户节点是,在properties中添加属性:taskType,默认是0,即正常的UserTask;1则为ServiceTask;
- 执行startProcess、commitTask以及rollback时,在确认响应后,增加一层判断,判断properties中的"taskType",如果是1,则继续指定的任务处理,不响应前端,处理完成后,直接提交;

最后
以上几种方式,可以解决一些常见的问题。但是Turbo仍有很多不足之处,需要靠大家持续不断的投入。
比如常见有些朋友想要用Turbo去做简易的审批流,经常遇到一些困惑。那审批流的业务上层,是否可以进行一起开源共建呢?欢迎大家一起参与进来

如何参与turbo的交流?
添加微信号:logic-flow,说明加入turbo用户群即可