1.基本概念
1)、eclipse装activiti流程设计的插件;
把这两个复制到eclipse的安装目录(右键eclipse图标,选中“打开此文件的安装位置”);重启eclipse;
2)、测试
1)、导包
导入流程框架的包,和数据库的包
<!--测试activiti -->
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.22.0</version>
</dependency>
<!-- 导入mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
</dependencies>
2)、写配置
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- 注意点:
id="processEngineConfiguration";id必须叫这个名字
-->
<!-- 流程引擎的配置信息:
ProcessEngine:
流程引擎可以得到7个service组件
-->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti_db" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="123456" />
<!-- 数据库模式:更新;
第一次运行:创建各个表
以后运行:修改表;
-->
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="false" />
<property name="asyncExecutorEnabled" value="true" />
<property name="asyncExecutorActivate" value="false" />
</bean>
</beans>
3)、测试
package com.atguigu.activiti.test;
import static org.junit.Assert.*;
import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.junit.Before;
import org.junit.Test;
public class ActivitiTest {
// 引擎只有一个即可
// 在类路径下找一个activiti.cfg.xml的配置文件来初始化流程引擎
//服务组件和流程引擎都是接口;
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService;
RuntimeService runtimeService;
RepositoryService repositoryService;
ManagementService managementService;
IdentityService identityService;
HistoryService historyService;
FormService formService;
@Before
public void serviceInit() {
// 任务服务组件:完成任务,签收任务等...
taskService = processEngine.getTaskService();
// 运行时服务组件:查询流程运行期间一些信息,控制流程等
runtimeService = processEngine.getRuntimeService();
// 持久化服务组件:负责保存流程定义信息等
repositoryService = processEngine.getRepositoryService();
// 管理组件,监听流程、定时任务等...
managementService = processEngine.getManagementService();
// 用户模块组件,CRUD一些用户以及用户分组等信息
identityService = processEngine.getIdentityService();
// 查询流程历史记录等信息;历史组件
historyService = processEngine.getHistoryService();
// 表单组件:没用
formService = processEngine.getFormService();
}
@Test
public void test() {
System.out.println("流程引擎:"+processEngine);
System.out.println("其他组件:");
}
}
1、流程框架第一次(启动)给数据库中建表,这个表有数据;(存储当前activiti版本信息等)
4、在文件的空白处(画bpmn图(流程图)的时候)点一下;在properties标签中可以填写当前流程的一些定义(介绍)信息
5、画流程图:
6、部署流程
@Test
public void testProcessDefinetionDeployee() {
// 1、如何定义一个流程;(画流程图);
// 2、部署这个定义好的流程;
// 3、部署:去数据库保存这个流程定义的信息
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("process/请假流程.bpmn")
.deploy();
System.out.println("部署的流程deploy对象"+deploy);
}
流程定义:ProcessDefinetion;流程信息保存;
流程实例:启动某个流程就是为这个流程创建一个流程实例;运行期间的数据都在ru表中
act_ru_event_ 流程期间的事件处理;
act_ru_execution_:流程的运行信息
act_ru_identitylink:和用户有关
ru_job:其他任务;
ru_task:用户要完成的任务;
ru_variable:流程变量;流程运行期间要用的数据;
解析:claim()方法是让某个人来领取该task(任务)
完成某任务:
1)、员工申请:指派人:动态取的
2、任务的签收和完成;
2)、网关;判断走分支;
1)、排他网关
else if();只会有一个分支到达;
2)、并行网关:
必须等待所有的分支都完成,汇聚任务才能完成,自动进行下一步;
/**
* 并行网关,必须所有汇聚点的分支都完成才可以
* @Description (TODO这里用一句话描述这个方法的作用)
*/
@Test
// gov-process:1:87504
public void test04() {
List<Task> list = taskService.createTaskQuery().processDefinitionId("gov-process:1:87504").list();
int i = 0;
for (Task task : list) {
System.out.println("任务信息:" + task.getId() + ";任务名:" + task.getName());
// 完成任务
taskService.complete(task.getId());
//if ((i++) % 2 == 0) {
// System.out.println("当前要完成的任务。"+task.getId() + ";任务名:" + task.getName());
// taskService.complete(task.getId());
//}
}
// List<HistoricProcessInstance> list2 = historyService.createHistoricProcessInstanceQuery().finished().list();
// for (HistoricProcessInstance historicProcessInstance : list2) {
// System.out.println(historicProcessInstance);
// }
//看这个流程是否完成了;
long count = historyService.createHistoricProcessInstanceQuery().processDefinitionId("gov-process:1:87504").finished().count();
System.out.println(count);
}
并行网管的图标是“+”号,排它网关的图标是“×”号
3)、包含网关;(并行+排他);
并行:满足并行条件的分支走;
包含:
满足走的就走;并行
还可以排他