1.部署activiti (可以用maven下载)
Activiti 是一个工作流引擎(其实就是一堆jar包API),业务系统访问(操作)activiti的接口,就可以方便的操作流程相关数据,这样就可以把工作流环境与业务系统的环境集成在一起,
2.流程定义
使用activity 流程建模语句(activity-designer)定义业务流程(.bpmn文件)
.bpmn文件就是业务流程定义文件,通过XML定义业务流程
(整个流程用图表达出来)
<?xml version="1.0" encoding="utf-8"?>
<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
<bpmn2:process id="process1596086637078" name="流程1596086637078">
<bpmn2:startEvent id="StartEvent_01ydzqe" name="开始">
<bpmn2:outgoing>SequenceFlow_13g4uaz</bpmn2:outgoing>
</bpmn2:startEvent>
<bpmn2:userTask id="UserTask_1lf9x0v" name="填写请假单">
<bpmn2:incoming>SequenceFlow_13g4uaz</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_0yljdna</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="SequenceFlow_13g4uaz" sourceRef="StartEvent_01ydzqe" targetRef="UserTask_1lf9x0v"/>
<bpmn2:userTask id="UserTask_0xa95fp" name="部门经理审批">
<bpmn2:incoming>SequenceFlow_0yljdna</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_0wc7wvy</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="SequenceFlow_0yljdna" sourceRef="UserTask_1lf9x0v" targetRef="UserTask_0xa95fp"/>
<bpmn2:userTask id="UserTask_1p57lka" name="人事复核">
<bpmn2:incoming>SequenceFlow_0wc7wvy</bpmn2:incoming>
<bpmn2:outgoing>SequenceFlow_0o4nsg1</bpmn2:outgoing>
</bpmn2:userTask>
<bpmn2:sequenceFlow id="SequenceFlow_0wc7wvy" sourceRef="UserTask_0xa95fp" targetRef="UserTask_1p57lka"/>
<bpmn2:endEvent id="EndEvent_05yb7io" name="结束">
<bpmn2:incoming>SequenceFlow_0o4nsg1</bpmn2:incoming>
</bpmn2:endEvent>
<bpmn2:sequenceFlow id="SequenceFlow_0o4nsg1" sourceRef="UserTask_1p57lka" targetRef="EndEvent_05yb7io"/>
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process1596086637078">
<bpmndi:BPMNShape id="StartEvent_01ydzqe_di" bpmnElement="StartEvent_01ydzqe">
<dc:Bounds x="382" y="82" width="36" height="36"/>
<bpmndi:BPMNLabel>
<dc:Bounds x="389" y="58" width="22" height="14"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_1lf9x0v_di" bpmnElement="UserTask_1lf9x0v">
<dc:Bounds x="490" y="60" width="100" height="80"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_13g4uaz_di" bpmnElement="SequenceFlow_13g4uaz">
<di:waypoint x="418" y="100"/>
<di:waypoint x="490" y="100"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="UserTask_0xa95fp_di" bpmnElement="UserTask_0xa95fp">
<dc:Bounds x="700" y="60" width="100" height="80"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_0yljdna_di" bpmnElement="SequenceFlow_0yljdna">
<di:waypoint x="590" y="100"/>
<di:waypoint x="700" y="100"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="UserTask_1p57lka_di" bpmnElement="UserTask_1p57lka">
<dc:Bounds x="910" y="60" width="100" height="80"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_0wc7wvy_di" bpmnElement="SequenceFlow_0wc7wvy">
<di:waypoint x="800" y="100"/>
<di:waypoint x="910" y="100"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="EndEvent_05yb7io_di" bpmnElement="EndEvent_05yb7io">
<dc:Bounds x="1152" y="82" width="36" height="36"/>
<bpmndi:BPMNLabel>
<dc:Bounds x="1159" y="125" width="22" height="14"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_0o4nsg1_di" bpmnElement="SequenceFlow_0o4nsg1">
<di:waypoint x="1010" y="100"/>
<di:waypoint x="1152" y="100"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn2:definitions>
3.流程定义部署
Activiti部署业务流程定义(.bpmn文件)
使用activiti提供的api把流程定义内容存储起来,在Activiti执行过程中可以查询定义的内容
activiti执行把流程定义内容存储在数据库中。
4.启动一个流程实例
流程实例也叫:Processinstance
启动一个流程实例表示开始一次业务流程的运行
在员工请假流程定义部署完成后,如果张三要请假就可以启动一个流程实例,如果李四要请假也启动一个流程实例,两个流程的执行互不影响
5.用户查询 待办任务(Task)
因为现在系统的业务流程已经交给activiti管理,通过activiti就亏查询当前流程执行到哪了,当前用户需要办理什么任务了,这些activiti帮我们管理了,而不需要开发人员自己编写在sql语句查询
6.用户办理任务
用户查询代办任务后,据可以办理某个任务,如果这个任务办理完成还需要其他用户办理,比如采购单创建由部门经理审核买这个过程也是由activiti帮我们完成了
7.流程结束
当任务办理完成后没有下一个任务结点了,这个流程实例就完成了
Activiti环境
数据库支持
CREATE DATABASE activiti DEFAULT CHARACTER SET utf8mb4;
通过IDEA创建maven的java 工程
加入相关的jar包
- 在Java工程中加入ProcessEngine所需要的jar包,包括:
- activiti-engine-7.0.0.GA.jar
- activiti依赖的jar包:mybatis、slf4j、log4j等
- activiti依赖的spring的jar包
- 数据库驱动
- 第三方数据库连接池dbcp
- 单元测试junit
<?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>org.example</groupId>
<artifactId>activiti_project</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<activiti.version>7.1.0.M6</activiti.version>
</properties>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>7.1.0.M6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.activiti/activiti-spring -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>7.1.0.M6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.activiti/activiti-bpmn-model -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>7.1.0.M6</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.activiti/activiti-json-converter -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>7.1.0.M6</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.activiti.cloud/activiti-cloud-services-api -->
<dependency>
<groupId>org.activiti.cloud</groupId>
<artifactId>activiti-cloud-services-api</artifactId>
<version>7-201802-EA</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.0</version>
</dependency>
<!-- log end -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.activiti.cloud.dependencies</groupId>
<artifactId>activiti-cloud-dependencies</artifactId>
<version>7.0.0.GA</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,可以看到log4j2内部各种详细输出-->
<configuration status="INFO">
<!--先定义所有的appender-->
<appenders>
<!--输出日志信息到控制台-->
<console name="Console" target="SYSTEM_OUT">
<!--控制日志输出的格式-->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</console>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<!--root:用于指定项目的根日志,如果没有单独指定Logger,则会使用root作为默认的日志输出-->
<loggers>
<root level="info">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"/>
<property name="password" value="root"/>
<property name="maxIdle" value="1"/>
</bean>
<!-- Activiti单独运行的ProcessEngine配置 -->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"/>
<!--
activiti数据库表处理策略
false(默认值):检查数据库的版本和依赖库的版本,如果不匹配就抛出异常
true:构建流程引擎时,执行检查,如果需要就执行更新。如果表不存在,就创建。
create-drop:构建流程引擎时创建数据库报表,关闭流程引擎时就删除这些表。
drop-create:先删除表再创建表。
create:构建流程引擎时创建数据库表,关闭流程引擎时不删除这些表
-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
测试
创建ProcessEngineConfiguration,通过ProcessEngineConfiguration创建ProcessEngine,在创建ProcessEngine的同时会自动创建数据库。
package com.sunxiaping;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-07-31 6:41
*/
public class ActivitiTest {
public static void main(String[] args) {
//创建ProcessEngineConfiguration对象
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
//创建ProcessEngine对象
ProcessEngine processEngine = configuration.buildProcessEngine();
System.out.println("processEngine = " + processEngine);
}
}
此时我们查看数据库,发现25张表
Activiti服务架构
Service
Service的创建方式
- 通过ProcessEngine创建Service,Service是工作流引擎提供用于进行工作流部署、指定、管理的服务接口。
Service接口 说明 RepositoryService Activiti的资源管理接口 RuntimeService Activiti的流程运行管理接口 TaskService Activiti的任务管理接口 HistoryService Activiti的历史管理接口 ManagementService Activiti的引擎管理接口 RepositoryService
- RepositoryService,是Activiti的资源管理接口,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此Service将流程定义文件的内容部署到计算机中。
- 除了流程部署定义以外还可以做如下的操作:
- 查询引擎中的发布包和流程定义。
- 暂停或激活发布包以及对应全部和特定流程定义。暂停意味着它们不能再在执行任务操作了,激活是对应的反向操作。
- 获取多种资源,像包含在发布包中的文件获引擎自动生成的流程图。
- 获取流程定义的POJO,可以用解析流程,而不必通过XML。
RuntimeService
- RuntimeService是Activiti的流程运行管理接口,可以从这个接口中获取很多关于流程执行相关的信息。
TaskService
- TaskService是Activiti的任务管理接口,可以从这个接口中获取任务的信息。
HistoryService
- HistoryService是Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会包含很多数据(根据配置),比如流程实例启动时间,任务的参与者,完成任务的时间,每个流程实例的执行路径,等等。
ManagementService
ManagementService是Activiti的引擎管理接口,提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti系统的日常维护
流程定义后面再整理
学习内容来自Activiti7的基本原理和使用