如何把Turbo流程引擎嵌入到自己的业务里?

Turbo是一款轻量级流程引擎服务框架,可通过插件与LogicFlow完美结合,可用于流程设计、服务编排等场景需求,简单易学,可快速上手

前言

在使用Turbo的时候,你是否也有这种困惑?

  • 业务和Turbo应该怎么关联起来?
  • 在每个节点执行完成后做一些事情,要怎么做?
  • Turbo没有ServiceTask,如果我想让系统自动执行某些任务,应该怎么办?

目标

通过几个场景的应用场景,说明如何在也里使用turbo

难度

简单

认识Turbo

其实在解决这些问题前,我们还是需要了解一下Turbo和业务层的关系:

  • Turbo是以SDK的形式提供了流程定义和驱动能力,他和业务层是分开的;
  • 业务层的数据和流程引擎的执行数据同样是分开的,可以是一个库,也可以是不同库;

另外,我们再了解一下它的执行过程:

流程里的UserTask,用于挂起流程,把执行操作进行中断,交给调用方来进行处理;

那调用方应该怎么处理呢?这时候就要依赖于两点:

  1. 配置在流程图中,节点的属性:properties;
  2. 流程执行返回的数据;

举个栗子

问题一:业务和Turbo应该怎么关联起来?

  1. 在流程图配置时,在节点UserTask-A的properties中添加了配置:
json 复制代码
{
  "propertiest":{
    "formKey":"test_abc",
    "formVersion":1
  }
}
  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"。

  1. 定义用户节点是,在properties中添加属性:taskType,默认是0,即正常的UserTask;1则为ServiceTask;
  2. 执行startProcess、commitTask以及rollback时,在确认响应后,增加一层判断,判断properties中的"taskType",如果是1,则继续指定的任务处理,不响应前端,处理完成后,直接提交;

最后

以上几种方式,可以解决一些常见的问题。但是Turbo仍有很多不足之处,需要靠大家持续不断的投入。

比如常见有些朋友想要用Turbo去做简易的审批流,经常遇到一些困惑。那审批流的业务上层,是否可以进行一起开源共建呢?欢迎大家一起参与进来

如何参与turbo的交流?

添加微信号:logic-flow,说明加入turbo用户群即可

相关推荐
Java中文社群16 分钟前
面试官:你项目是如何保证高可用的?
java·后端·面试
冲鸭ONE1 小时前
for循环优化方式有哪些?
后端·性能优化
兮动人1 小时前
DBeaver连接OceanBase数据库
后端
刘鹏3781 小时前
深入浅出Java中的CAS:原理、源码与实战应用
后端
Lx3522 小时前
《从头开始学java,一天一个知识点》之:循环结构:for与while循环的使用场景
java·后端
fliter2 小时前
RKE1、K3S、RKE2 三大 Kubernetes 发行版的比较
后端
aloha_2 小时前
mysql 某个客户端主机在短时间内发起了大量失败的连接请求时
后端
程序员爱钓鱼2 小时前
Go 语言高效连接 SQL Server(MSSQL)数据库实战指南
后端·go·sql server
xjz18422 小时前
Java AQS(AbstractQueuedSynchronizer)实现原理详解
后端
Victor3562 小时前
Zookeeper(97)如何在Zookeeper中实现分布式协调?
后端