GENGEN
主页
vuepress
  • GIT命令
  • python+django
  • vue cli搭建项目
  • babel es6转换es5
  • docker aliyun配置
  • npm 配置
  • linux 常用命令
  • Ubuntu 下Linux 命令
  • github
  • gitee
  • csdn
  • 关于我
主页
vuepress
  • GIT命令
  • python+django
  • vue cli搭建项目
  • babel es6转换es5
  • docker aliyun配置
  • npm 配置
  • linux 常用命令
  • Ubuntu 下Linux 命令
  • github
  • gitee
  • csdn
  • 关于我
  • java基础

    • JDK8 函数式编程
    • JDK8 新特性之Date-Time
    • Servlet 源码分析
    • ArrayList 源码
    • LinkedList 源码
    • HashMap 源码
    • String 源码
    • BigDecimal 源码
    • java 类的加载
    • Class 源码
    • Synchronized锁升级
    • 事务的传播机制
    • knowledge
  • JAVA WEB

    • Java Servlet
    • 权限设计
    • logback日志的链路追踪
  • DATABASE

    • MySQL EXPLAIN详解
    • MySQL 索引
    • MySQL 表锁、行锁
    • MySQL ACID与transcation
    • 分布式事务
    • MySQL MVCC机制
    • Mysql 乐观锁与悲观锁
    • 分布式锁1 数据库分布式锁
    • 分布式锁2 Redis分布式锁
    • 分布式锁3 ZK分布式锁
  • SpringCloud

    • SpringCloud服务注册中心之Eureka
    • SpringCloud服务注册中心之Zookeeper
    • SpringCloud服务调用之Ribbon
    • SpringCloud服务调用之OpenFeign
    • SpringCloud服务降级之Hystrix
    • SpringCloud服务网关之Gateway
    • SpringCloud Config分布式配置中心
    • SpringCloud服务总线之Bus
    • SpringCloud消息驱动之Stream
    • SpringCloud链路追踪之Sleuth
    • SpringCloud Alibaba Nacos
    • SpringCloud Alibaba Sentinel
  • Spring

    • SpringBoot
    • Spring-data-jpa入门
    • SpringCloud问题
    • dispatcherServlet 源码分析
    • @SpringBootApplication注解内部实现与原理
    • spring启动初始化初始化
  • 中间件

    • 分布式协调服务器Zookeeper
    • 服务治理Dubbo
    • 分布式配置管理平台Apollo
    • 消息中间件框架Kafka
    • 分布式调度平台ElasticJob
    • 可视化分析工具Kibana
    • ElacticSearch 基础
    • ElacticSearch进阶
    • ElacticSearch集成
  • 环境部署

    • 应用容器引擎Docker
    • DockerCompose服务编排
    • 负载均衡Nginx
    • Nginx的安装配置
    • K8S基础
  • 代码片段

    • listener 监听模式
    • spingboot 整合redis
    • XSS过滤
    • profile的使用
    • ConfigurationProperties注解
  • 设计模式

    • 工厂模式
    • 单例模式
    • 装饰者模式
    • 适配器模式
    • 模板方法模式
    • 观察者模式
  • 读书笔记

    • 《Spring in Action 4》 读书笔记
    • 《高性能mysql》 读书笔记
  • NoSQL

    • Redis基础
    • Redis高级
    • Redis集群
    • Redis应用
  • MQ

    • rabbitMQ基础
    • rabbitMQ高级
    • rabbitMQ集群
  • JVM

    • JVM体系架构概述
    • 堆参数调整
    • GC 分代收集算法
    • JVM 垃圾回收器
    • JVM 相关问题
  • JUC

    • JUC总览
    • volatile关键字
    • CAS
    • ABA问题
    • collections包下线程安全的集合类
    • Lock 锁
    • LockSupport
    • AQS
    • Fork/Join分支框架
    • JUC tools
    • BlockingQueue 阻塞队列
    • Executor 线程池
    • CompletableFuture
    • 死锁以及问题定位分析
  • Shell

    • shell命令
    • shell基础
  • Activiti

    • IDEA下的Activiti HelloWord
    • 流程定义的CRUD
    • 流程实例的执行
    • 流程变量
  • VUE

    • vue基础
    • vue router
    • Vuex
    • Axios 跨域
    • dialog 弹出框使用
    • vue 动态刷新页面
    • vue 封装分页组件
    • vue 动态菜单
    • vue 常用传值
  • Solidity 智能合约

    • Solidity 基础
    • Solidity ERC-20
    • Solidity 101
  • English

    • 时态

IDEA 插件安装

  • IDEA 的Plugins搜索 actiBPM安装 重启IDEA

  • IDEA 安装路径下bin目录,idea.exe.vmoptions 与 idea64.exe.vmoptions 下,分别加入 -Dfile.encoding=UTF-8

创建项目,导入依赖

  • 新建springboot 项目,加入maven依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring</artifactId>
    <version>5.18.0</version>
</dependency>
<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-engine</artifactId>
    <version>5.18.0</version>
    <exclusions>
        <exclusion>
            <artifactId>slf4j-api</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
        <exclusion>
            <artifactId>spring-beans</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
        <exclusion>
            <artifactId>jackson-core-asl</artifactId>
            <groupId>org.codehaus.jackson</groupId>
        </exclusion>
        <exclusion>
            <artifactId>commons-lang3</artifactId>
            <groupId>org.apache.commons</groupId>
        </exclusion>
        <exclusion>
            <artifactId>commons-lang3</artifactId>
            <groupId>org.apache.commons</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.13</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

画流程图

  • resource 目录下,新建 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="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&amp;characterEncoding=utf8"></property>
        <property name="jdbcUsername" value="root"></property>
        <property name="jdbcPassword" value="root"></property>
        <property name="databaseSchemaUpdate" value="true"></property>
    </bean>
</beans>
  • 加入 log4j.properties

  • 新建 diagrams包

    • 右键 New - BPMN File 创建一个hello.bpmn的文件

    • 画流程图 StartEvent - UserTask - UserTask - EndEvent

      • UserTask 分别修改名称为 学生请假 与 老师批准
    • 按流程顺序连线

    • Rename修改文件后缀名为.xml保存

    • 右键 Diagrams - Show BPMN 2.0 Designer..

    • 点击画布上面 Export to file,保存路径选取 diagrams包下,保存生成PNG文件

    • Rename改回bpmn文件

流程引擎对象

 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

Tips

默认加载类路径下名称为 activiti.cfg.xml 文件

  • 流程引擎创建各个service,这些service调用工作流23张表

    • RepositoryService 管理流程定义
    RepositoryService repository = processEngine.getRepositoryService();
    
    • RuntimeService 执行管理、包括启动、推进、删除流程实例等操作
    RuntimeService runtime = processEngine.getRuntimeService();
    
    • TaskService 任务管理
    TaskService task = processEngine.getTaskService();
    

流程流转过程

package com.example.activiti;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.CollectionUtils;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ActivitiApplicationTests {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

	/**
	 * 部署流程定义	 */
	@Test
	public void deploy() {
		Deployment deployment = processEngine.getRepositoryService()//与流程定义、部署相关service
				.createDeployment()//创建一个部署对象
				.name("helloword 入门")
				.addClasspathResource("diagrams/hello.bpmn")//从classPath加载,一次加载一个
				.addClasspathResource("diagrams/hello.png")
				.deploy();//完成部署
		System.out.println(deployment.getId());
		System.out.println(deployment.getName());
	}

	/***
	 *启动流程实例
	 */
	@Test
	public void runProcess() {
		String processInstanceKey = "myProcess_1";//使用key,默认启动最新的流程定义启动
		ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例相关
				.startProcessInstanceByKey(processInstanceKey);//使用流程定义的KEY启动实例,key对应bpmn文件中id,或者表act_re_procdef的key
		System.out.println(pi.getId());//流程实例ID
		System.out.println(pi.getProcessDefinitionId());//流程定义ID
	}

	/***
	 * 查询当前人的个人任务
	 */
	@Test
	public void task() {
		//act_ru_task
		String assignee = "张三";
		List<Task> taskList=processEngine.getTaskService()
				.createTaskQuery()
				.taskAssignee(assignee).list();
		if (!CollectionUtils.isEmpty(taskList)){
			for (Task task : taskList) {
				System.out.println("ID:"+task.getId());
				System.out.println("任务名称:"+task.getName());
				System.out.println("创建时间:"+task.getCreateTime());
				System.out.println("办理人:"+task.getAssignee());
			}
		}
	}

	/**
	 * 办理我的任务
	 */
	@Test
	public void myTask() {
		//任务ID 上面task的task.getId()
		String taskId = "7504";
		processEngine.getTaskService().complete(taskId);
		System.out.println("完成任务");
	}
}

Tips

执行完myTask以后,再去执行task查询张三的任务,则查不到了,因为任务流转到了李四哪里, task()中String assignee 改成 李四,执行,能看到任务,再执行myTask(),李四的任务也执行完了。 这个工作流就执行完end 一个完成的工作流流转过程就执行完成。

Last Updated:
Contributors: wal365@126.com
Next
流程定义的CRUD