工作流引擎Activiti入门
工作流引擎
工作流
是指业务过程的部分或整体在计算机应用环境下的自动化。
工作流主要解决的主要问题是:
为了实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。
BPM
BPM(Business Process Management),即业务流程管理,
是一种以规范化的构造端到端的卓越业务流程为中心,以持续的提高组织业务绩效为目的的系统化方法。
BPMN
BPMN(Business Process Modeling Notation)即业务流程建模与标注,
BPMN是BPM的建模语言标准之一,
目的是提供被所有业务用户理解的一套标记语言,包括业务分析者、软件开发者以及业务管理者与监察者。
Activiti
Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准。
集成Activiti
环境:
JDK版本:1.8。
MySQL版本:8.0.27。
新建数据库
Activiti需要数据库支持
新建项目
pom.xml:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.duohoob</groupId>
<artifactId>activity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>activity</name>
<description>Demo project for Spring Boot and Activiti</description>
<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>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--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>
</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>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
log4j的配置
在resources新建log4j.properties:
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
#\u65E5\u5FD7\u7684\u5B58\u653E\u8DEF\u5F84
log4j.appender.LOGFILE.File=D:\\work\\eclipse-workspace2\\activity\\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
mysql的配置
按照Activiti的默认方式,在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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- processEngine Activiti的流程引擎 -->
<!-- 默认id对应的值为processEngineConfiguration -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="root123"/>
<!-- activiti数据库表处理策略 -->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
生成mysql表
在test新建ActivityTest.java:
package com.duohoob.activity;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.junit.Test;
public class ActivityTest {
/**
* 使用activiti提供的默认方式来创建mysql的表
*/
@Test
public void createTable(){
// 使用classpath下的activiti.cfg.xml中的配置创建processEngine
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
System.out.println(engine);
}
}
运行Junit test,创建ProcessEngine时会自动创建表。
流程操作
Activiti bpmn designer
eclipse
help→install new software→add
http://activiti.org/designer/update/
流程定义
在resources新建bpmn目录,
假如是请假流程,
在bpmn新增Leave.bpmn:
提交请假申请节点的Assignee填worker,表示该节点由worker完成;
部门经理审批节点的Assignee填manager;
行政人事备案节点的Assignee填personnel。
bpmn文件其实是通过xml文件表示业务流程,open with xml editor就可以查看xml内容。
流程存储/部署
bpmn定义好后,通过Activiti提供的api,将我们的流程保存到数据库中。
testDeployProcess
@Test
public void testDeployProcess() {
// 创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("bpmn/Leave.bpmn")
.name("请假流程")
.deploy();
System.out.println(deploy.getId());
System.out.println(deploy.getName());
}
运行
流程启动
通过Activiti提供的api,开启一个流程实例。
testStartProcess
@Test
public void testStartProcess() {
// 创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取runtimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
System.out.println("流程实例id:" + processInstance.getId());
System.out.println("当前活动id:" + processInstance.getActivityId());
}
"myProcess"是bpmn流程定义时的ID,是流程定义key。
运行
任务查询
查询当前Assignee待执行的任务,比如说worker。
testFindPersonalTaskList
@Test
public void testFindPersonalTaskList() {
// 负责人
String assignee = "worker";
// 创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取taskService
TaskService taskService = processEngine.getTaskService();
// 获取任务列表
List<Task> list = taskService.createTaskQuery()
.processInstanceId("17501")
.taskAssignee(assignee)
.list();
for (Task task : list) {
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
"17501"是上一步的流程实例ID。
运行
list不为空,说明有需要worker处理的任务,
任务ID是指当前节点的ID,我们需要worker来完成该节点,推动流程前进。
任务处理
testcompleteTask
@Test
public void testcompleteTask() {
// 负责人
String assignee = "worker";
// 创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取taskService
TaskService taskService = processEngine.getTaskService();
// 获取任务
Task task = taskService.createTaskQuery()
.processInstanceId("17501")
.taskAssignee(assignee)
.singleResult();
// 处理任务
taskService.complete(task.getId());
}
运行
worker的任务就完成了,现在流程走到了部门经理审批节点,需要由manager来完成。
参考文章:
小Y先生。:Activiti工作流教程
Young丶:工作流引擎Activiti万字详细入门