项目结构
使用spring整合的Activiti,配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti_2017"/>
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="root123"/>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
测试代码
/**
* 画流程图或者有人给你画好了流程图
* 1.初始化流程引擎(①代码方式构建 ②spring构建)
* 2.部署流程图
* 3.启动流程
*/
public class ActivitiDemo {
/**
* 初始化流程引擎,生成23张表(方式一)
*/
@Test
public void initProcessEngine() {
//1.创建流程引擎对象,基于静态工厂创建
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.
createStandaloneInMemProcessEngineConfiguration();
//2.配置数据源信息
processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti_2017");
processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
processEngineConfiguration.setJdbcUsername("root");
processEngineConfiguration.setJdbcPassword("root123");
//3.生成表策略(有就不生成,数据库没有就生成)
processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
//4.基于流程配置来创建流程引擎
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
//输出流程引擎基本信息
System.out.println(processEngine.getName());
}
/**
* 初始化流程引擎,生成23张表(方式二)
*/
@Test
public void initProcessEngine2() {
//读取activiti.cfg.xml
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//输出
System.out.println(processEngine.getName());
}
/**
* 部署流程,会涉及到3张表
* select * from act_re_deployment :流程部署基本信息表
* select * from act_re_procdef :流程部署定义表,和信息是一对一关系
* select * from act_ge_bytearray:流程部署的流程图信息表(记录xml和图片信息,把图片放进的数据库,类型blob)
*
* 注意:可以重复部署,部署一次act_re_deployment表加一条数据
* 问题:相同流程,访问数据库是访问哪一条?
* 答:根据act_re_procdef表中的key启动,它会基于高版本启动(表中version字段)
*
*
* 部署时可能会出现错误:org.activiti.bpmn.exceptions.XMLException: 3 字节的 UTF-8 序列的字节 3 无效。
* 解决方案:修改idea安装目录中的bin下的两个文件(我是安装的64位,32位可选择32位的文件):
* 1.idea64.exe.vmoptions 2.IdeaWin64.dll
* 修改方案:在文件末尾加上:-Dfile.encoding=UTF-8,不要有空格不然idea启动会报错,仔细检查bpmn中流程是否乱码
*
*/
@Test
public void bulidProcess() {
//1.获取流程图对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.基于流程图对象获取到部署服务对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.通过部署service来部署流程图
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
Deployment deployment = deploymentBuilder.name("最终版版请假流程")
.addClasspathResource("leave.bpmn")
.addClasspathResource("leave.png")
.deploy();
//4.输出流程部署对象信息
System.out.println("流程部署对象ID:"+deployment.getId());
System.out.println("流程部署对象名字:"+deployment.getName());
}
/**
* 启动流程,会涉及到2张表
* select * from act_ru_execution:流程实例的基本信息表,没启动一个流程就会有一条记录
* select * from act_ru_task:流程实例的任务节点表
* 流程定义ID和流程实例ID区别?
* 定义:具体某个人(如:张三、李四)
* 实例:具体某个流程(如:请假流程,离职流程)
*/
@Test
public void startProcess() {
//1.获取流程图对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2/通过流程图对象获取运行时service服务对象
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.通过runtimeService来启动流程,创建一个流程实例,通过key启动,数据库act_re_procdef表中的key字段
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");
//4.打印输出
System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId());
System.out.println("流程实例ID:"+processInstance.getId());
}
/**
* 查询任务
*/
@Test
public void queryTask() {
//1.获取任务引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//2.获取任务service
TaskService taskService = engine.getTaskService();
//3.查询任务
List<Task> taskList = taskService.createTaskQuery().list();
for (Task task : taskList) {
System.out.println("任务ID:"+task.getId());
System.out.println("任务name:"+task.getName());
System.out.println("任务处理人:"+task.getAssignee());
System.out.println("任务所属流程实例ID:"+task.getProcessInstanceId());
System.out.println("任务流程定义ID:"+task.getProcessDefinitionId());
}
}
/**
* 处理任务,执行完看查看数据库表中的变化,依次执行流程(填入依次执行的taskId),直到执行完毕
* 执行完毕后act_ru_execution和act_ru_task表不会存在数据,可查看历史记录act_hi_actinst表
*
* 加有驳回按照画的顺序执行
*/
@Test
public void completeTask() {
//1.获取任务引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//2.获取任务service
TaskService taskService = engine.getTaskService();
//3.根据任务id执行
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("flag",false);
taskService.complete("50004", map);
System.out.println("50004节点任务完成,可以进入下一个节点任务了");
}
}