目录
工作流概述
工作流就是“业务过程的部分或整体在计算机应用环境下的自动化”,他主要解决的是“使多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行”,从而实现某个预期的业务目标、或者促使此目标的实现。
一、Activiti概述
Activiti 是一个针对业务人员、开发人员和系统管理员的轻量级工作流和业务流程管理 (BPM) 平台。 它的核心是一个用于 Java 的超快速和坚如磐石的 BPMN 2 流程引擎。 它是开源的,并在 Apache 许可下分发。 Activiti 可以在任何 Java 应用程序、服务器、集群或云中运行。 它与 Spring 完美集成,非常轻量级,基于简单的概念。
二、快速入门
1.准备工作
①IDEA需要安装actibpm插件,新版idea可直接在plugins中搜索Activiti BPMN visualizer安装即可
②安装Camunda Modeler插件(用来操作bpmn文件画板),解压即可使用。
链接:https://pan.baidu.com/s/1BIj1yTHGHfxu1q_H1l4LcQ
提取码:0505
idea配置插件:File > setting > Tools > External tool > 点击+号
验证:完成以上操作后在此处看见有新增的工具即可
2.导入相关依赖
使用Maven创建一个普通web项目,并导入Activiti及MySQL相关依赖(activiti需要数据库支持才能工作)。
pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sailing</groupId>
<artifactId>activit_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--定义版本号-->
<properties>
<java.version>1.8</java.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<activiti.version>7.0.0.Beta1</activiti.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--activiti核心包-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--activiti与spring整合的包-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--bpmn模型处理-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--bpmn转换-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--bpmn json数据转换-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--bpmn布局-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--bpmn云支持-->
<dependency>
<groupId>org.activiti.cloud</groupId>
<artifactId>activiti-cloud-services-api</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--连接池-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</project>
3.创建配置文件
①在resources目录下,创建一个名为log4j.properties的日志配置文件,用于监测activiti工作流的日志信息。
log4j.rootCategory=debug,CONSOLE,LOGFILE
log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
#???????
log4j.appender.LOGFILE.File=c:\\SOFT\\activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
②使用activiti提供的默认方式来创建mysql的表。默认方式的要求是在resources下创建activiti.cfg.xml文件
<?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">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/myactiviti?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="root"></property>
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
4.创建activiti所需的25张表
在test目录下新建一个类,生成activiti所需的25张表:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.junit.Test;
public class ActivitiUtil {
/**
*使用activiti提供的默认方式来创建mysql的表
*/
@Test
public void generateTable()
{
ProcessEngine processEngine = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti.cfg.xml")
.buildProcessEngine();
System.out.println(processEngine);
}
}
生成表如下:
这些数据表都是以act为前缀的,表明是activiti所需的数据表。其中act_ge_*用于存放通用类型的数据;act_hi_*存放历史数据;act_re_*存放流程定义的内容和所需静态资源;act_ru_*存放activiti运行时所需的数据。
5.idea操作
①创建bpmn文件
在resources目录下创建bpmn目录,然后在bpmn目录下新建一个bpmn文件,命名随意,但最好有意义。
② 操作文件
(1)、利用Camunda Modeler插件打开画板
进入画板界面如下:画板左侧竖框里为可添加的节点,可通过拖拉拽等操作进行流程配置
上图为一个简单的流程配置,配置完毕后保存即可在idea中的xml文件自动生成相关代码,流程配置完成后也可生成流程图片
6.流程部署
@Test
//流程部署 修改ACT_RE_DEPLOYMENT(流程部署表) ACT_GE_PROPERTY(流程定义表)
public void test() {
//1、创建(流程引擎)ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取RepositoryServcie(re表的服务层)\
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、使用service进行流程的部署,部署bpmn和png
Deployment deploy = repositoryService.createDeployment()
.name("出差申请流程")
.addClasspathResource("bpmn/cc.bpmn20.xml")
// .addClasspathResource("bpmn/cc.bpmn20.png")
.deploy();
}
7.启动流程实例
//启动实例 修改表ACT_HI_TASKINST(历史任务实例数据表)ACT_HI_PROCINST(历史流程实例数据表,正在执行的任务也在其中)ACT_HI_ACTINST(历史节点数据,图片上的节点信息)
//ACT_HI_IDENTITYLINK(历史流程用户信息数据表)ACT_RU_EXECUTION(运行时流程执行实例数据表,一条是开始事件的执行实例,这个一直存在,只到流程结束后才会自动删除,is_active字段表示是否正在执行实例)
//ACT_RU_TASK(运行时任务信息数据信息表)
@Test
public void qdTest() {
//1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3、根据流程定义的id启动流程
ProcessInstance instance = runtimeService.startProcessInstanceByKey("cc");//key 为bpmn文件名
}
8.查询个人待办任务
//查询个人待办任务
@Test
public void findRw() {
//1、获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取taskService
TaskService taskService = processEngine.getTaskService();
//3、根据流程key 和 任务的负责人 查询任务
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey("cc") //流程Key
.taskAssignee("worker") //要查询的负责人(assignee)
.list();
//4、输出
for (Task task : taskList) {
System.out.println("流程实例id=" + task.getProcessInstanceId());
System.out.println("任务Id=" + task.getId());
System.out.println("任务负责人=" + task.getAssignee());
System.out.println("任务名称=" + task.getName());
}
}
9.完成个人任务
方式一(完成当前节点的任务):
//完成个人任务(完成指定人的任务)
@Test
public void okRw() {
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取操作任务的服务 TaskService
TaskService taskService = processEngine.getTaskService();
//完成任务,参数:任务id,完成zhangsan的任务,10005是上述ACT_RU_TASK表的id
taskService.complete("125003");
}
方式二(完成其余节点任务)
//完成剩余节点的任务
@Test
public void okSyRw() {
//完成jerry的任务
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取操作任务的服务 TaskService
TaskService taskService = processEngine.getTaskService();
//获取jerry - myEvection 对应的任务
Task task = taskService.createTaskQuery()
.processDefinitionKey("cc")
.taskAssignee("lala")
.singleResult();
System.out.println("流程实例id=" + task.getProcessInstanceId());
System.out.println("任务Id=" + task.getId());
System.out.println("任务负责人=" + task.getAssignee());
System.out.println("任务名称=" + task.getName());
//完成jerry的任务
taskService.complete(task.getId());
//输出
//流程实例id=10001
//任务Id=12502
//任务负责人=jerry
//任务名称=经理审批
//完成jack的任务
Task taskjack = taskService.createTaskQuery()
.processDefinitionKey("cc")
.taskAssignee("rose")
.singleResult();
System.out.println("流程实例id=" + taskjack.getProcessInstanceId());
System.out.println("任务Id=" + taskjack.getId());
System.out.println("任务负责人=" + taskjack.getAssignee());
System.out.println("任务名称=" + taskjack.getName());
//完成jack的任务
taskService.complete(task.getId());
//输出
//流程实例id=10001
//任务Id=15002
//任务负责人=jack
//任务名称=总经理审批
//完成rose的任务
// taskjack = taskService.createTaskQuery()
// .processDefinitionKey("test`")
// .taskAssignee("rose")
// .singleResult();
// System.out.println("流程实例id=" + taskjack.getProcessInstanceId());
// System.out.println("任务Id=" + taskjack.getId());
// System.out.println("任务负责人=" + taskjack.getAssignee());
// System.out.println("任务名称=" + taskjack.getName());
完成jack的任务
// taskService.complete(task.getId());
//输出
//流程实例id=10001
//任务Id=17502
//任务负责人=rose
//任务名称=财务审批
}
10.查看历史信息
//查看历史信息
@Test
public void findMsg() {
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取HistoryService
HistoryService historyService = processEngine.getHistoryService();
//获取 actinst表的查询对象
HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//查询 actinst表,条件:根据 InstanceId 查询
//instanceQuery.processInstanceId("2501");
//查询 actinst表,条件:根据 DefinitionId 查询
instanceQuery.processDefinitionId("cc:1:15003");
//增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序
instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
//查询所有内容
List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
//输出
for (HistoricActivityInstance hi : activityInstanceList) {
System.out.println(hi.getActivityId());
System.out.println(hi.getActivityName());
System.out.println(hi.getProcessDefinitionId());
System.out.println(hi.getProcessInstanceId());
System.out.println("<==========================>");
}
}
输出:
sid-28bf87b6-fcc1-4765-a9e5-525c6c9fa9c8
开始流程
cc:1:15003
17501
<==========================>
sid-ee93fbee-de9e-49c9-8017-8509e6998a28
提交出差申请
cc:1:15003
17501
<==========================>
sid-25a1d1fd-16f7-469d-a3be-8f03bee416b6
主管审批
cc:1:15003
17501
<==========================>
sid-7880c303-7f43-43a8-a9c0-55258addead2
经理审批
cc:1:15003
17501
<==========================>
sid-e215c013-23a9-415a-bbd2-1904ea2b5d55
结束流程
cc:1:15003
17501
<==========================>
sid-28bf87b6-fcc1-4765-a9e5-525c6c9fa9c8
开始流程
cc:1:15003
27501
<==========================>
sid-ee93fbee-de9e-49c9-8017-8509e6998a28
提交出差申请
cc:1:15003
27501
<==========================>
sid-25a1d1fd-16f7-469d-a3be-8f03bee416b6
主管审批
cc:1:15003
27501
<==========================>
sid-7880c303-7f43-43a8-a9c0-55258addead2
经理审批
cc:1:15003
27501
<==========================>
sid-e215c013-23a9-415a-bbd2-1904ea2b5d55
结束流程
cc:1:15003
27501
<==========================>
以上为activiti基本的使用流程,其他功能需使用监听器、变量、网关等进行实现,相关教程后续发出。