一、什么是流程定义

  流程定义是线下bpmn2.0标椎去描述业务流程,通常使用activiti-explorer(web控制台)或 activiti-eclipse-designer 插件对业务流程进行建模,这两种方式都遵循 bpmn2.0 标准。使用designer  设计器绘制流程,会生成两个文件:.bpmn 和.png

  

1、.bpmn文件

  

2、.png文件生成

  ①首先将.bpmn文件改为.xml文件

    

  ②然后右键该xml文件Diagrams--->show BPMN 2.0 Designer就能生成一张流程图,将流程图导出保存到项目对应目录即可

    

    

  ③然后将.xml改回.bpmn即可

    

注意:

  流程图生成前须设置编码格式然后重启IDEA!!!

-Dfile.encoding=UTF-8

  

二、流程定义部署

1、什么是流程定义部署

  将线下定义的流程部署到activiti数据库中,这就是流程定义部署,通过调用activiti的api将流程定义的bpmn和png两个文件一个一个添加部署到activiti中,也可以将两个文件打成ZIP包进行部署;

2、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">
<!--数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/activiti"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</bean> <!--配置Activiti使用的processEngine对象 默认命名为processEngineConfiguration-->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
<!--配置数据源方式二:-->
<!--<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>--> <!--指定数据库生成策略-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>

3、单个文件部署方式

  分别将bpmn文件和png图片文件部署;  

package com.zn;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.junit.Test; public class ActivitiTest { /*流程部署
* `act_ge_bytearray` 流程定义的资源信息,包含bpmn和png流程文件信息
* `act_re_deployment` 流程部署信息 包含流程名称,ID,key等
* `act_re_procdef` 流程定义信息
* */
@Test
public void deployment(){
//获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService对象进行流程部署
RepositoryService repositoryService = processEngine.getRepositoryService();
//进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
Deployment deployment = repositoryService.createDeployment()
//加载流程文件
.addClasspathResource("bpmnFiles/holiday.bpmn")
.addClasspathResource("bpmnFiles/holiday.png")
//设置流程名称
.name("请假流程")
.key("holidayKey")
//部署
.deploy();
//输出部署信息
System.out.println("流程名称:"+deployment.getName());
System.out.println("流程ID:"+deployment.getId());
System.out.println("流程Key:"+deployment.getKey());
}
}

4、压缩包部署方式

  将bpmn文件和png图片压缩成zip包;

  

package com.zn;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.junit.Test; import java.io.InputStream;
import java.util.zip.ZipInputStream; public class ActivitiTest { /**
* 压缩包的方式部署流程
*/
@Test
public void deploymentByZip(){
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//定义一个输入流,加载Zip文件
InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("bpmnFiles/holiday.zip");
//定义一个ZIPInputStream对象
ZipInputStream zipInputStream=new ZipInputStream(inputStream);
//流程部署
Deployment deploy = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.name("请求审批流程")
.key("holidayKey")
.deploy();
System.out.println("流程名称:"+deploy.getName()); }
}

  执行操作控制台效果

  

  数据库展示

  

5、流程定义查询

  查询部署的流程定义;

package com.zn;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.junit.Test; import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream; public class ActivitiTest { /**
* 流程定义信息查看
*/
@Test
public void getDefaultProcessEngine(){
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//得到流程定义查看对象ProcessDefinitionQuery
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//指定查看的流程processDefinitionKey()指定流程定义的key值 orderByProcessDefinitionVersion根据流程定义版本号排序
List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("holiday").orderByProcessDefinitionVersion().desc().list();
for (ProcessDefinition processDefinition:holiday) {
System.out.println("流程定义ID:"+processDefinition.getId());
System.out.println("流程定义的名称:"+processDefinition.getName());
System.out.println("流程定义的Key:"+processDefinition.getKey());
System.out.println("流程定义的版本号:"+processDefinition.getVersion());
}
}
}

  执行操作控制台效果

  

6、流程定义删除

  删除已经部署成功的流程定义;

package com.zn;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.junit.Test; import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream; public class ActivitiTest { /**
* 删除流程:
* 假设在删除时,当前正在有该流程实例执行,那么会导致删除失败
* 如果强制要求,则可以使用repositoryService.deleteDeployment("1",true); true代表级联删除
*/
@Test
public void deleteDeployment(){
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//删除流程
repositoryService.deleteDeployment("10001",true);
}
}

  说明:

    1.使用RepositoryService删除流程定义;

    2.如果流程定义下没有正在运行的流程,则可以普通删除;

    3.如果将流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关级联全部删除;

三、从数据库中读取资源文件到本地

1、导入依赖

    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>

2、代码实现

package com.zn;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.apache.commons.io.IOUtils;
import org.junit.Test; import java.io.*;
import java.util.List;
import java.util.zip.ZipInputStream; public class ActivitiTest { /**
* 从数据中读取资源文件到本地
*/
@Test
public void getResource() throws IOException {
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//获取到流程查询对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//获取到流程资源
processDefinitionQuery.processDefinitionKey("holiday");
//获取单一结果
ProcessDefinition processDefinition = processDefinitionQuery.singleResult();
//流程部署的ID
String deploymentId = processDefinition.getDeploymentId();
//获取到bpmnResource
InputStream bpmnStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
//获取到png
InputStream pngStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
//构建输出流
OutputStream bpmnOut = new FileOutputStream("E:\\accp\\Y2\\毕设项目\\"+processDefinition.getResourceName());
OutputStream pngOut = new FileOutputStream("E:\\accp\\Y2\\毕设项目\\"+processDefinition.getDiagramResourceName());
//将数据输出到磁盘当中
IOUtils.copy(bpmnStream,bpmnOut);
IOUtils.copy(pngStream,pngOut);
//关流
pngOut.close();
bpmnOut.close();
pngStream.close();
bpmnStream.close();
}
}

3、效果

  

四、业务系统和流程系统进行关联

  通过buessinessKey字段标识业务系统的主键数据ID,进而表名当前业务执行到了哪一个流程

1.代码实现

package com.zn;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.task.Task;
import org.apache.commons.io.IOUtils;
import org.junit.Test; import java.io.*;
import java.util.List;
import java.util.zip.ZipInputStream; public class ActivitiTest { /**
* 启动流程实例和业务系统关联
* 正常应该先添加数据到业务表当中,拿到当前添加数据的主键ID,通过启动流程实例,将主键ID交给BuessniessKkey
* 代表和流程系统进行关联
*/
@Test
public void startInstance() {
/**
* 让张三在页面提交,然后拿到ID
*/ /**
* 创建张三请假的实例流程
*/
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
//生成流程
runtimeService.startProcessInstanceByKey("holiday","1"); /**
* 张三提交请假审批
*/
//获取一个TaskService对象
TaskService taskService = processEngine.getTaskService();
//获取张三的任务
Task task = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").singleResult();
//任务审批
taskService.complete(task.getId());
}
}

2.数据库

  

五、流程激活和挂起

1、所有流程

package com.zn;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.io.IOUtils;
import org.junit.Test; import java.io.*;
import java.util.List;
import java.util.zip.ZipInputStream; public class ActivitiTest { /**
* 所有流程定义的挂起
*/
@Test
public void allSuspend(){
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取repositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//获取流程定义
ProcessDefinition holiday = repositoryService.createProcessDefinitionQuery().processDefinitionKey("holiday").singleResult();
//获取到当前流程定义是否为暂停状态 suspended方法为true代表为暂停 false就是运行的
boolean suspended = holiday.isSuspended();
if(suspended){
repositoryService.activateProcessDefinitionById(holiday.getId(),true,null);
System.out.println("该流程定义激活");
}else{
repositoryService.suspendProcessDefinitionById(holiday.getId(),true,null);
System.out.println("该流程定义暂停");
}
}
}

控制台效果:

  

再次执行效果:

  

2、单个流程

package com.zn;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.io.IOUtils;
import org.junit.Test; import java.io.*;
import java.util.List;
import java.util.zip.ZipInputStream; public class ActivitiTest { /**
* 单个流程实例的挂起
*/
@Test
public void singleSuspend(){
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("2501").singleResult();
//获取到当前流程定义是否为暂停状态 suspended方法为true代表为暂停 false就是运行的
boolean suspended = processInstance.isSuspended();
if(suspended){
runtimeService.activateProcessInstanceById("2501");
System.out.println("xx的请假流程激活");
}else{
runtimeService.suspendProcessInstanceById("2501");
System.out.println("xx的请假流程挂起");
}
}
}

控制台效果:

  

再次执行效果:

  

Activiti7流程定义的更多相关文章

  1. activiti7查询流程定义的相关信息

    package com.zcc.activiti02; import org.activiti.engine.ProcessEngine;import org.activiti.engine.Proc ...

  2. activiti7删除流程定义的相关信息

    package com.zcc.activiti02; import org.activiti.engine.ProcessEngine;import org.activiti.engine.Proc ...

  3. Activiti7 绑定业务主键以及流程定义 流程实例的挂起和激活

    绑定业务主键businessKey /** * 绑定业务主键 */ @Test public void bindingBusinessKey() { // 获取RuntimeService Runti ...

  4. 【流程】Flowable流程定义总结

    背景 近几年,互联网企业从消费互联网向产业互联网转型.在消费互联网时期,企业面对的时C端消费者,而产业互联网面对的是B端用户. 产业互联网涉及方方面面,企业信息化的建设就是B端用户的业务之一,在企业就 ...

  5. Activiti 学习(二)—— Activiti 流程定义和部署

    概述 在这一节,我们将创建一个 Activit 工作流,并启动这个流程,主要包含以下几个步骤: 定义流程,按照 BPMN 的规范,使用流程定义工具,用流程符号把整个流程描述出来 部署流程,把画好的流程 ...

  6. Activiti工作流学习(一)部署对象和流程定义

    一.前言 前一段时间在工作中,使用了流程审批,对api的调用非常不熟悉,都是调用别人写好的接口在界面上进行显示,基本了解了流程审批的主要步骤,现对流程审批进行学习,主要是调用api进行CRUD操作,感 ...

  7. Activiti 删除key值相同的所有不同版本的流程定义

    package com.mycom.processDefinition; import java.io.File; import java.io.IOException; import java.io ...

  8. Activiti 查询最新版本的流程定义

    package com.mycom.processDefinition; import java.io.File; import java.io.IOException; import java.io ...

  9. Activiti 删除流程定义

    package com.mycom.processDefinition; import java.io.InputStream; import java.util.List; import java. ...

随机推荐

  1. Python学习笔记--装饰器的实验

    装饰器既然可以增加原来函数的功能,那能不能改变传给原函数的参数呢? 我们实验一下,先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date ...

  2. 压力测试(七)-html可视化压测报告细讲

    1.阿里云Linux服务器 Jmeter压测实战之jtl文件生成和查看 简介: 利用软件从阿里云Centos服务器下载压测报告,讲解Jtl文件,并怎么查看文件 可以通过打开jmeter,新建线程组-& ...

  3. 系统级编程(csapp)

    系统级编程漫游 系统级编程提供学生从用户级.程序员的视角认识处理器.网络和操作系统,通过对汇编器和汇编代码.程序性能评测和优化.内存组织层次.网络协议和操作以及并行编程的学习,理解底层计算机系统对应用 ...

  4. Web中间件常见漏洞总结

    一.IIS中间组件: 1.PUT漏洞 2.短文件名猜解 3.远程代码执行 4.解析漏洞 二.Apache中间组件: 1.解析漏洞 2.目录遍历 三.Nginx中间组件: 1.文件解析 2.目录遍历 3 ...

  5. 提权篇之简单介绍和exp利用过程

    正文开始.... 提权的方法有很多种,因为一开始我入门的时候是看的小迪的网络教程,当然也推荐大家去看小迪的教程,或者直接小迪的实地培训班.这个可没什么利益关系,我认识他,他可不认识我,,但是我是在网上 ...

  6. mysql 存储过程 执行存储过程修改了表中所有行的信息

    存储过程中的where条件语句,如果传入的参数和表字段名相同,存储过程就会把这个约束条件忽略.小结:存储过程中传递的参数名不要和字段名相同.特别是修改.删除等操作,可能会对整张表产生影响.后果会很严重 ...

  7. css中grid属性的使用

    grid布局 加在父元素上的属性 grid-template-columns/grid-template-rows 定义元素的行或列的宽高 如果父元素被等分成了9等分,则,不管有多少个子元素,都显示9 ...

  8. 我厌倦了 Redux,那就造个轮子 Rectx:第三集

    仓库:215566435/rectx 前言 麻烦快去我的仓库里面喷: 老子学不动了,求不要更新. 呵呵,你没想到吧,这玩意儿竟然有第三集!我靠,我自己都没想到,让我们悄悄的回顾一下前两集完全没想到,竟 ...

  9. springcloud eureka注册中心搭建

    环境描述 ① jdk1.8 ② idea ③ springcloud版本 Finchley.SR2 ④ maven3.0+ 导入jar包 <properties> <project. ...

  10. VUE一 基础语法

    一.模板语法 二.Class和Style绑定 三.条件渲染 四.vue事件处理器 五.vue组件