流程定义:
流程定义:概念,规定 如法律,如规定 又如规定员工请假需经理同意
流程实例:具体案例,如小明偷了小强家的钱这条案件,又如小明向经理王红请假
流程定义文件如:bpmn文件存放在act_re_procdef (procdef是process和definition 及流程定义的缩写)表中
中止与激活流程定义 --suspendProcessDefinitionByXXX,activateProcessDefinitionByXXX
项目结构如图
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 -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="root30075" />
<!--true 策略 给我们创建流程引擎的相关表,及字段等 -->
<property name="databaseSchemaUpdate" value="true" />
<!--不让activiti根据bpmn自动生成流程图png文件 -->
<!-- <property name="createDiagramOnDeploy" value="false" /> -->
</bean>
</beans>
DeployTest.java
package com.xiangshuai.act.c8;
import java.util.List;
import java.util.UUID;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.identity.User;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.ProcessDefinition;
/**
* 流程定义测试
* 文件在E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤4-Activiti流程定义
* 或 我的网盘\我的笔记学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤4-Activiti流程定义
* @author lqx
*
*/
public class DeployTest {
public static void main(String[] args) {
//insertImgToAct_ge_bytearray();
//noInsertImgToAct_ge_bytearray();
//testSuspendProcessDefinitionByKey();
testAuth();
}
/* 我们没有提供流程图PNG图片,并且activiti.cfg.xml<property name="createDiagramOnDeploy" value="true" />默认true
* 那么activiti会根据test1.bpmn插入一条带 test1.myProcess.png-(这个myProcess是test1.bpmn<process>
标签的id值)这个图片的记录到 act_ge_bytearray中,并与流程定义相关的表act_re_deployment与act_re_procdef 关联起来
*/
public static void autoInsertImgToAct_ge_bytearray(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
DeploymentBuilder builder = rs.createDeployment();
builder.addClasspathResource("test1.bpmn");
builder.deploy();
}
/* 我们提供流程图PNG图片-test2.png,那么activiti会根据test2.bpmn插入一条带 test2.png-()这个图片的记录到 act_ge_bytearray中,并与流程定义相关的表act_re_deployment与act_re_procdef 关联起来
activiti不会再自动生成一条test2.myProcess.png这条记录
*/
public static void insertImgToAct_ge_bytearray(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
DeploymentBuilder builder = rs.createDeployment();
builder.addClasspathResource("test2.bpmn").addClasspathResource("test2.png");//部署我们提供流程图PNG图片-test2.png
builder.deploy();
}
/* 除这个方法-noInsertImgToAct_ge_bytearray 外 其他时候均需要将activiti.cfg.xml<property name="createDiagramOnDeploy" value="false" />
* 注释掉
* 不插入 pgn图片
* 我们没有提供流程图PNG图片,并且activiti.cfg.xml<property name="createDiagramOnDeploy" value="false" />默认true
* 那么activiti 不会 根据test3.bpmn插入一条带 test3.myProcess.png-(这个myProcess是test3.bpmn<process>的标签的id值)这个图片的记录到 act_ge_bytearray中
*/
public static void noInsertImgToAct_ge_bytearray(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
DeploymentBuilder builder = rs.createDeployment();
builder.addClasspathResource("test3.bpmn");
builder.deploy();
}
//中止与激活流程定义 --suspendProcessDefinitionByXXX,activateProcessDefinitionByXXX
public static void testSuspendProcessDefinitionByKey(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//获得管理流程定义的对象
RepositoryService rs = engine.getRepositoryService();
DeploymentBuilder deployment = rs.createDeployment();
deployment.addClasspathResource("test4.bpmn");
Deployment dep = deployment.deploy();
//查询流程定义进行中止
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
System.out.println("id="+pd.getId());
// 中止流程定义
rs.suspendProcessDefinitionByKey(pd.getKey());
//中止流程定义后启动流程实例会抛出异常,因为流程定义被中止了
RuntimeService runtimeService = engine.getRuntimeService();
runtimeService.startProcessInstanceById(pd.getId());
}
//指定流程只让某个人进行启动,即只让某个人有启动某个流程的权限
public static void testAuth(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//获得管理流程定义的对象
RepositoryService rs = engine.getRepositoryService();
DeploymentBuilder deployment = rs.createDeployment();
deployment.addClasspathResource("test5.bpmn");
Deployment dep = deployment.deploy();
//查询流程定义,并创建一个用户,让这个流程只有此人(也可以设置一组group人)有权限启动
// 保存的三表为 中间表 act_ru_identitylink,act_id_user,act_re_procdef
IdentityService is = engine.getIdentityService();
User user = is.newUser("xiaoming");
user.setId(UUID.randomUUID().toString());
is.saveUser(user);
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
rs.addCandidateStarterUser(pd.getId(), user.getId());//参数1流程定义ID,参数2用户ID,
//查询 xiaoming这个用户又多少流程启动权限
List<ProcessDefinition> list = rs.createProcessDefinitionQuery().startableByUser(user.getId()).list();
list.forEach((tpd)->{
System.out.println(tpd.getId());
});
}
}