一、什么是Activiti?
Activiti是工作流框架,是解决企业流程管理的解决方案。那流程是什么呢?我们先来看一个请假例子。
也就是说,这种问题就是一种流式的控制管理,因为里面没有包含着回馈,相当于只是一个方向。其实,到这里,就可以得出Activiti的官方定义:
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。
二、工作流的概念:
工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在“多个参与者”之间按照某种“预定义的规则”传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
三、Activiti的配置文件
activiti.cfg.xml
Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 创建ProcessEngineConfiguration对象的bean -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- 配置对象的配置信息 :连接数据库,使用MyBatis连接池 -->
<property name="jdbcUrl"
value="jdbc:mysql:///activiti?createDatabaseIfNotExist=true" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="root" />
<!--
databaseSchemaUpdate: 设置流程引擎启动和关闭时如何处理数据库表。
false(默认):检查数据库表的版本和依赖库的版本, 如果版本不匹配就抛出异常。
true: 构建流程引擎时,执行检查,如果需要就执行更新。 如果表不存在,就创建。
create-drop: 构建流程引擎时创建数据库表,关闭流程引擎时删除这些表。
-->
<property name="databaseSchemaUpdate" value="true" />
</bean>
</beans>
四、核心API
4.1ProcessEngine(核心–服务大管家)
直接看ProcessEngine源码.面向服务编程。
1)在Activiti中最核心的类,其他的类都是由他而来。
2)产生方式:
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
在前面看到了多种创建ProcessEngine(流程引擎)的方式,而这里要简化很多,调用ProcessEngines的getDefaultProceeEngine方法时会自动加载classpath下名为activiti.cfg.xml文件。
3)可以产生RepositoryService
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
4)可以产生RuntimeService
RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
5)可以产生TaskService
TaskService taskService = defaultProcessEngine.getTaskService();
五、Activiti流程部署的方法
部署流程定义也可以认为是增加流程定义。
/**
* ①:获取核心对象ProcessEngine
* ②:分析需求,通过核心对象获取对应的"服务实例"
* ③:使用服务的方法做事情
* 三张表:
* 1)act_re_deployment 部署信息表:部署一次就有一条记录
2)act_re_procdef 流程定义数据表 :部署一次,就产生一个流程,有一个流程定义数据
3)act_ge_bytearray 二进制数据表:一个流程定义会有有两个2机制数据:.bpmn和png的数据
//部署一个流程定义
*/
@Test
public void deployTest() {
// 1、获取核心对象
ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
// 2、分析需求,通过核心对象获取对应的“服务实例”
RepositoryService repositoryService = processEngine.getRepositoryService();
//通过仓库服务创建一个部署builder
DeploymentBuilder builder = repositoryService.createDeployment();
//添加部署的资源文件:必须添加两个文件,png文件可以不添加,自动添加,但是自动添加后在数据库看到是乱码的、在classpath下按照名字加载
builder.addClasspathResource("MyProcess.bpmn").addClasspathResource("MyProcess.png");
// 3、使用服务的方法做事情
//部署
builder.deploy();
}
说明:
1)首先获得默认的流程引擎,在创建时会自动加载classpath下activiti.cfg.xml
2)通过流程引擎获取了一个RepositoryService对象->仓库服务对象
3由仓库的服务对象产生一个部署对象配置对象,用来封装部署环境的相关配置。
4)可以看出这是一个链式编程,在部署配置对象中设置显示名,上传规则文件相对classpath的地址。
5)部署,也是往数据库中存储流程定义的过程。
6)这一步在数据库中将操作三张表:
a)act_re_deployment
存放流程定义的显示名和部署时间,每部署一次增加一条记录
b)act_re_procdef
存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。
c)act_ge_bytearray
存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中。