方法中有处理主要业务场景的代码,还有调用其它业务场景的方法,这部分业务场景的代码相当于主流程的后置流程。后置流程越来越多的时候,主方法的代码就越来越繁重,越来越大。而且当主流程不需要某些后置流程的时候,或者修改某个后置流程执行的先后顺序,或者某些后置流程需要链式顺序执行还是并发执行,或者它执行失败后的一个异常补偿机制,补偿之后是进行执行下一个流程还是中断。这些后置流程也有可能被其它方法调用。

为了解决这些问题,基于工作流的设计理论,工作流就是对业务的流程化抽象,用工作流的方式来规划和编排代码运行方式。当然市场上有很多开源的流程引擎,例如 activiti、flowable 等。为了更好的定制化及满足不同业务场景,实现了一套自己的工作流。

怎么设计的?

之前是在主流程方法里面去一个个调用后置流程的方法,现在把这部分方法改成一个个类。后置流程把它比作是一个个节点,节点包括类名,执行顺序,事务控制,异步还是同步,是否链式执行等信息。数据库我们是这样设计的,我们把这些信息存放到一张表里面,然后另一张表维护了主流程的信息,同时有个字段关联了节点信息。

代码层方法,利用 Spring AOP,当主流程执行完后,查询出主流程有哪些后置流程节点,通过节点的类名,反射实例化对应的类,通过数据库配置的执行顺序去执行类里面的方法,利用 Spring 监听事件去做同步还是异步。

为什么要这么设计?

当主流程不需要某些后置流程的时候,可以灵活的添加和删除。可以让主流程快速响应,后置流程异步调用等优势。