Flowable工作流引擎的使用(0启示篇)
先来一手标准三连,什么是flowable,flowable可以干什么,怎么用,详细介绍还是看文档吧
为什么要用工作流:
传统的业务代码中,经常会有一些完整的业务流程,而这些流程状态的变化,我们一般是通过状态机来实现的,即A状态 --> B状态 --> C状态。对于传统的流程,比如支付流程,先下单,然后付款,扣库存等等操作,我们一般直接编码一步步改状态即可。
倘若我们的产品变动比较灵活,需要在业务流程中加一些新的节点,那么我们就需要修改之前的部分逻辑。给个伪代码说明一下.
原来的代码
void actionA(){
state = a;
}
void actionB(){
if(state == a){
state = b
}
}
修改后的代码
void actionA(){
state = a;
}
void actionA2(){
if(state == a){
state = a2;
}
}
void actionB(){
if(state == a2){
//if(state == a){
state = b
}
}
可以看到我们添加一个新的任务节点,但是我们可能需要修改其他已经写好的逻辑,如果这样的改动非常多,肯定不太好的。那么有没有什么办法,让业务代码对业务流程无感知,无论业务流程怎么改,我只需要在不同类型的任务节点执行不同的操作,不关注这个任务执行完毕之后,还会有多少任务,什么时候结束的技术呢?答案是工作流引擎。
工作流引擎基本思路就是将配置的流程保存在数据库,我们通过流程引擎的流程控制代替状态机,只需要在流程每个节点到达的时候做对应的事情,不需要关心下个节点是什么节点,上一个节点是什么节点。
flowable工作流引擎的执行流程
既然要使用工作流引擎,那么我们就需要把我们的业务流程告诉流程引擎。流程引擎知道我们的业务流程之后,我们还要在一个合理的时间点去开启流程,流程中有无数的任务节点,在不同的任务节点,我们做不同的事情即可。简单的工作流程如下
- 前端配置流程,将流程配置信息以XML或者JSON的格式给到后端
- 后端调用流程引擎的部署方法,部署流程
- 后端调用流程引擎的发起流程方法,发起一个流程,流程引擎根据我们配置的流程信息,流程推进到第一个任务节点
- 流程引擎的每个任务节点到达时可以发出一个事件,我们在不同的事件可以处理一些任务到达时的逻辑
- 后端调用流程引擎的推动流程方法,对流程进行推动,流程引擎会推动到下一个任务节点
- 重复以上操作,直到流程结束
我们修改一下之前的状态机的代码,可以看到状态机的判断不见了,而是在流程不同节点的设置的监听器去执行业务逻辑。流程引擎控制了业务扭转,执行过的任务不会再执行,所以我们可以任务一个任务节点就是一个状态,状态推进下去之后,我们业务逻辑做不同的调整。
class Service{
void actionA(){
...
}
void actionB(){
...
}
void actionC(){
...
}
}
class ATaskListener{
Service service = new Service();
@Override
public void consumer(Object obj){
service.actionA();
}
}
class BTaskListener{
Service service = new Service();
@Override
public void consumer(Object obj){
service.actionB();
}
}
class BTaskListener{
Service service = new Service();
@Override
public void consumer(Object obj){
service.actionB();
}
}
总结
我们可以看到工作流对代码侵入性还是比较大的,不过相对而言我们的状态的维护非常安全可靠,工作流是基于数据库的自带分布式的特性,也解决了分布式的一些问题,开箱即用,一个任务同时被执行的一些并发问题都已经处理掉了。
除了上述以外,工作流的最重要的工作任务是做审批,工作流引擎里面提供了丰富的API,审核人,代理人,审批组,不同种类的流程组件等概念,这些放下一篇讲。