作者
本文的作者是我部门的同事:凌海天,一个热衷于技术的LOLer,在Activiti方面有不少经验,这次的封装也是基于我们部门的整体Web开发框架的发展目的而做的。
出现问题
在使用act的过程中,我们发现使用act时有些地方可能需要一点包装,因为不同业务发起流程写入的代码却不尽相同,为了防止代码的坏味道,我们打算对act进行一些对应我们公司业务的一些延伸,以方便我们能够更加的方便使用
解决思路
通过将activit简单的封装一层,打成jar包后放入我们的maven私服中,所以我遇到了第一个问题:如何封装activiti。。。
配置activiti
问题:在一个纯净的环境下配置activiti并且将重要资源配置外置
在网上找绝大多数activiti配置都是通过xml的方式,但是如果使用xml的话就不能将数据源放到外面动态的配置了(也可能是我太渣,没有深入了解的锅),所以只能自己慢慢来了;思路:看着xml的配置将其中的类取出并做相应配置
1 | //引入maven |
避免一个数据源生多个流程引擎,将流程引擎藏在了ActSpringFactory类中,用以生成act常用的方法
1 | public class ActSpringFactory implements ProcessEngine{ |
到这为止activiti就算是配置好了,如果要用的话可以打个jar包直接就使用了,但是这并没有对activiti的功能进行扩展,下面将开始简单的说一下当初遇到这个问题时的想法,在这里也算是一个记录,不至于几天之后忘得一干二净。
抛出问题
假如,现在的业务是有多个流程,每个流程都的具体业务不一样,但是他们发起流程的方式是一样的,都是将业务基础信息放入一个表中,启动流程,,将其中能够简单展示的部分提出和activiti的流程id一起放入到一个中心表,在审批时只需要查询中心表列出列表,在审批时如果需要查看详细信息,可以根据基本信息id去对应的信息表查询。到这就是一个基本的流程闭环了,但是问题也出现了
从图中可以看出,虽然流程业务保存的数据都不相同,但是他们的方式是一样,很明显的可以看出能够进行合并,而设计模式中策略模式就非常的合适这一业务,我们来回顾一下策略模式(引自百度百科):
定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化
流程策略的设计思路
首先根据策略模式的定义,我们要定一个接口,是所有将要发起流程的dao都要去实现的顶层接口
1 | /** |
定义接口后发现数据来源也必须确定,所以规定了bean的顶层父类。。。(只是先放了一些我们业务会用到的一些常用参数)
1 | /** |
在将接口和bean都配置好后我们还要讲他们给拼装起来,不然是没办法找到对应bean的,为避免数据的不纯净,所以首先规定类dao和bean对应防止的类DaoAndBean,并规定了范围;然后是存放的容器ActDaoAndBeanMap,其实就是一个map,只是在put进map时简单的检测了一下数据的正确性,并且因为不能确定一个业务的数据表的数量,也就是bean和dao的对应数量,所以做成了可变参数
1 | /** |
1 | /** |
最后的策略调用,两个主要方法:insert和getMsg,这两个方式就是将顶层接口的方法根据存入map的配对取出后,循环的执行,其他的方法都是启动流程,加入了activiti的start方式
1 | /** |
好了,到这为止就已经全部说完我的一些想法了,目前只是刚刚写完,还没有经过真实、具体的业务测试,所以如果存在任何问题,本人概不负责…
再加上一点配置demo
1 | @Component |
如果是使用springboot作为项目基础框架的话,你们需要这个(获取spring的ApplicationContext)
1 | @Component |