Activiti浅析
Activiti框架以其开源的特性,作为近年来迅猛发展的工作流框架之一。而另一种工作流框架JBPM5目前来说也是非常热门的工作流框架。虽然这两个框架是所属于不同的两个公司,但其实这俩框架却有着不小的关系呢。Activiti工作流框架开发的主导者Tom Baeyens之前任职于jBoss公司,也就是目前的JBPM5的发布公司,担任的是之前JBPM4工作流引擎的首席架构师。但是根据推测由于jBoss公司内部矛盾以及对工作流引擎未来版本的架构中的严重分歧,最后导致Tom Baeyens离开了jBoss公司,转而就职于Alfresco公司。然而,在数月的时间里,Tom
Baeyens就推出了基于JBPM4工作流引擎的开源工作流系统Activiti。
Activiti框架以及JBPM5框架都是BPM(Bussiness Process Manage)系统(符合BPM规范),都是BPMN2过程建模和执行环境。都是开源项目-遵循ASL协议( Apache的 软件许可)。 都源自JBoss(Activiti5是jBPM4的衍生,jBPM5则基于Drools Flow)。 都很成熟,从无到有,双方开始约始于2年半前。 都有对人工任务的生命周期管理。 Activiti5和jBPM5唯一的区别是jBPM5基于WebService – HumanTask标准来描述人工任务和管理生命周期。 如有兴趣了解这方面的标准及其优点,可参阅WS – HT规范介绍 。 都使用了不同风格的 Oryx 流程编辑器对BPMN2建模。 jBPM5采用的是 Intalio 维护的开源项目分支。 Activiti5则使用了Signavio维护的分支。
那么activiti作为一种工作流框架,目前广泛应用于众多软件开发公司。那么如果想要使用activiti开源工作流系统实现自己的业务系统,那么其实首先第一步,是要熟悉BPMN2.0的规范,当然这一步也不是必须的。BPMN2.0规范作为一种标准实现的是工作流业务系统当中可能会遇到的一些基本模型的建立。
目前主流的Java开发IDE为eclipse和intellij idea。这两个开发工具都有支持Activiti的开发,拥有界面式的流程编辑器。通过对业务流程进行绘制,流程编辑器会对业务流程进行解析并生成一个.bpmn文件,其实质上就是一个.xml文件,该文件当中声明式的说明了各个流程的实现以及业务类型,后续通过Activiti的流程引擎可以对该xml文件进行解析,并执行对应的操作及流程跳转功能。
这里给出Activiti的Github社区网址,相关内容可以到上面下载咨询。那么Activiti工作流系统基于的工作流引擎到底是个什么东西呢?目前Activiti工作流业务系统提供了一套基于java的API接口,流程引擎其实它是一个class类的实例,只是通过这个对象可以获取到所有的关于工作流业务流程的内容以及操作所有的流程进行。如图1.1是工作流引擎对象以及其可以派生的对象:
其中,activiti.cfg.xml文件为核心配置文件,该配置文件集成在Spring的IOC容器当中,可以产生ProcessEngineConfiguration对象,这个对象就是流程引擎的配置对象,ProcessEngine对象则为流程引擎对象,该对象是工作流业务系统的核心,所有的业务操作都是由这个对象所派生出来的对象实现。关于对象的操作请参考Activiti5的API文档。
目前的Activiti5工作流业务系统总共涉及23张表,如图1.2为表的相关信息。当然这些表并不是都是必须的,有些用不到的功能的表自然而然就不需要了。目前Activiti5的工作流业务系统支持MySql、Oracle和DB2等主流数据库,默认使用的数据库为H2。相关数据库的配置参考相关文档。
Activiti工作流业务系统对Spring的集成非常好,这对于熟悉Spring框架的开发人员来说是一种比较好的特性。但是Activiti框架当中并不是封装了业务功能,只是实现了最基本的操作,可以使使用者更好地实现某些功能,但是由于activiti中并没有对驳回进行有效的封装,所以如果开发人员想使用驳回功能,那就需要自己通过activiti的API自己手动的封装一个接口了。
那么对于Activiti工作流框架,我们怎么来使用呢?接下来,我们就来简单的说一说activiti的使用方式。既然要使用activiti框架,先来看看Activiti的基础编程框架:
接下来第一步是需要开发工具,前面我们说了,可以使用集成了acitiviti界面式流程编辑器功能的eclipse或者intellij idea。那么这里我们使用eclipse开发工具。如下图所示:
第二步:则需要引入对应的activiti的jar包,可以手动下载下来,也可以使用maven项目管理工具统一管理软件包。那么这里我们使用maven项目管理工具:
第三步:前面我们说过,activiti工作流业务系统需要23张表,那么表的创建那也是必不可少的,之前我们说过。可以通过activiti的工作流引擎的对象来创建。在这里我们就使用这种方式创建。
完成了上面的三步之后,那么接下来就是简单的实现一个请假业务流程。第一步,画流程图,设置流程开始节点start和结束节点end,设置任务userTask。如下图所示:
需要注意的是,该流程图中的每一个userTask都需要设置下一个处理人assignee,可以使用流程变量动态设置处理人,也可以直接固定处理人,这里我们先固定处理人。如下图所示:
完成了请假业务流程之后,我们来看看这个bpmn文件到底是个什么类型的文件,我们使用txt文本编辑器打开,发现类似于一个xml文件,只是后缀为.bpmn而已。如下图所示:
接下来就是开始真正的代码编写了。前面我们说过activiti工作流框架与Spring几乎完美的融合,但是这里我们只是涉及到activiti浅析,所以本文只是使用原生的api接口实现简单的请假流程。
首先使用工作流引擎配置对象加载activiti.cfg.xml文件,前面说过activiti.cfg.xml为工作流的配置文件,这里贴出activiti的内容,使用的数据库为mysql数据库。
接下来可以使用流程引擎对象ProcessEngineConfiguration加载配置文件,通过配置对象获取ProcessEngine对象,但是我们不采用配置文件的形式创建这个对象,那么接下来所有的内容都可以使用这个对象派生出来的内容完成所有的功能。其实刚才创建表的那段代码就可以完成这个功能。
使用ProcessEngine对象加载请假流程配置文件,创建流程定义模板,也即是部署流程。接下来通过流程定义模板创建一个流程实例对象,填写请假单,保存请假单,即创建一个请假流程。
这段代码创建了请假流程的定义。
其中,engine为ProcessEngine的实例对象,processDefinitionId为流程定义的Id,该值在创建流程定义的时候就会生成,run.startProcessIntanceById为通过流程定义Id创建一个流程实例对象,这个流程实例对象就对应的是一次请假流程。
在通过创建的请假流程中,再提交请假流程到上级部门(例如:部门经理等),部门经理通过后,才能说明该请假流程完成,10002为任务的唯一标识。对应的流程图中的每一个任务userTask对应一个taskId。
在本文中,请假流程的例子并没有涉及到数据库的操作,也就是说所有的数据库的内容都是由activiti框架为我们完成,我们只需要实现对应的业务流程即可。这极大的简化了工作流的相关内容,但是如果想要用好activiti工作流框架,那么就必须对这一套api文档进行详尽细致的了解及学习。如果想了解更多关于activiti对数据库操作的内容。请参阅相关资料。