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,审核人,代理人,审批组,不同种类的流程组件等概念,这些放下一篇讲。