第五节:Activiti6.0——流程定义相关API
时间:2022-07-25
本文章向大家介绍第五节:Activiti6.0——流程定义相关API,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、概述
介绍:在发布一次资源后,会生成对应的流程定义(存储在表act_re_procdef)中,该定义记录一个流程的信息,如下图所有:
二、流程定义的发布生成
- 我们的资源只有bpmn文件时,发布后activiti会帮我们生成对应的流程图png。如下:
- 我们可以自己添加png资源,此时activiti就不会帮我们生成。代码如下:ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); DeploymentBuilder builder = repositoryService.createDeployment(); //发布资源是自己的bpmn和png builder.addClasspathResource("test2.bpmn").addClasspathResource("test2.png"); builder.deploy(); processEngine.close(); System.exit(0);
资源图片:
数据库中查看:
注意匹配流程图的规则:
- 优先查找与流程描述XML文件同名并且后缀为流程ID的图片文件。
- 如果根据第一条规则查找不到相应的流程图文件,那么就会查找与流程描述XML文件同名的图片文件
3.只发布bpmn文件,并且不加自己的png图片时,同时我们也不想activiti帮我们生成png时,只需要在activiti.cfg.xml配置文件中添加如下属性:
<!--该属性是在我们发布资源时,是否自动生成对应png流程图-->
<property name="createDiagramOnDeploy" value="false" />
三、流程定义的中止(使失效)和激活(使生效)
介绍:发布流程定义后,定义只是一个规则,我们去用的时候才会真正的生成实例。不过我们在生成实例之前可以对流程定义中止和激活,测试如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
DeploymentBuilder builder = repositoryService.createDeployment().addClasspathResource("test3.bpmn");
Deployment deployment = builder.deploy();
//获取流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//将流程定义中止(使流程定义不生效,即不能生成实例)
System.out.println("processDefinition的id:" + processDefinition.getId());
repositoryService.suspendProcessDefinitionById(processDefinition.getId());
RuntimeService runtimeService = processEngine.getRuntimeService();
//尝试生成一个流程实例
//因为流程定义被中止了,所有会报异常:
// Exception in thread "main" org.activiti.engine.ActivitiException: Cannot start process instance. Process definition My Process (id = myProcess_1:20:90003) is suspended
try {
runtimeService.startProcessInstanceById(processDefinition.getId());
}catch (Exception e){
e.printStackTrace();
}
//此处把流程定义再激活
repositoryService.activateProcessDefinitionById(processDefinition.getId());
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
System.out.println("实例:" + processInstance);
processEngine.close();
System.exit(0);
结果如下:
processDefinition的id:myProcess_1:25:102503
#失效后不能生成实例
org.activiti.engine.ActivitiException: Cannot start process instance. Process definition My Process (id = myProcess_1:25:102503) is suspended
at org.activiti.engine.impl.util.ProcessInstanceHelper.createAndStartProcessInstance(ProcessInstanceHelper.java:67)
at org.activiti.engine.impl.util.ProcessInstanceHelper.createAndStartProcessInstance(ProcessInstanceHelper.java:51)
at org.activiti.engine.impl.cmd.StartProcessInstanceCmd.createAndStartProcessInstance(StartProcessInstanceCmd.java:109)
.......
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:39)
at org.activiti.engine.impl.RuntimeServiceImpl.startProcessInstanceById(RuntimeServiceImpl.java:114)
at com.xjf.test.Test3.main(Test3.java:37)
#重新激活后生成实例
实例:ProcessInstance[102504]
四、流程定义的权限控制(1)
介绍:流程定义发布后,我们可以对流程定义的使用进行权限控制。指定用户或用户组来使流程定义只能由对应的用户来使用(只有保存关系的作用,activiti不会主动进行权限控制)。可以使用repositoryService.createProcessDefinitionQuery().startableByUser()方法来查关系。
设置的代码如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//首先创建用户
IdentityService identityService = processEngine.getIdentityService();
User user = identityService.newUser(UUID.randomUUID().toString());
user.setFirstName("xu");
user.setLastName("xiaoming");
user.setPassword("123456");
identityService.saveUser(user);
//发布流程定义
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("test3.bpmn").deploy();
//获取流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//给流程定义指定候选人
repositoryService.addCandidateStarterUser(processDefinition.getId(),user.getId());
//查询用户能使用流程定义,从act_ru_identitylink表中去查
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().startableByUser(user.getId()).list();
list.forEach(System.out::println);
processEngine.close();
System.exit(0);
结果:
ProcessDefinitionEntity[myProcess_1:26:105003]
数据库查看: 用户数据表(act_id_user)查看:
流程定义(act_re_procedef)查看:
此时对应的关联关系会保存到表 act_ru_identitylink 中:
五、流程定义的权限控制(2)
**介绍:**流程定义跟用户或用户组的权限关系会保存在act_ru_identitylink表中,不过Activiti不会对这些权限进行拦截或者检查,只能根据这些关系与查询条件,返回相应的符合要求的数据。下面测试为用户查流程定义和流程定义查用户:
- 编码:ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); IdentityService identityService = processEngine.getIdentityService(); //发布资源 Deployment deployment = repositoryService.createDeployment().addClasspathResource("test2.bpmn").deploy(); //创建用户 User user1 = identityService.newUser("9"); user1.setFirstName("狗"); user1.setLastName("狗"); identityService.saveUser(user1); User user2 = identityService.newUser("10"); user2.setFirstName("猫"); user2.setLastName("猫"); identityService.saveUser(user2); //创建用户组 Group group1 = identityService.newGroup("12"); group1.setName("权限测试组1"); identityService.saveGroup(group1); Group group2 = identityService.newGroup("13"); group2.setName("权限测试组2"); identityService.saveGroup(group2); //获取流程定义 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult(); //给流程定义设置权限用户和用户组 repositoryService.addCandidateStarterUser(processDefinition.getId(),user1.getId()); repositoryService.addCandidateStarterUser(processDefinition.getId(),user2.getId()); repositoryService.addCandidateStarterGroup(processDefinition.getId(),group1.getId()); repositoryService.addCandidateStarterGroup(processDefinition.getId(),group2.getId()); //1. 根据用户查询有权限的流程定义 List<ProcessDefinition> processDefinitionList = repositoryService.createProcessDefinitionQuery().startableByUser(user1.getId()).list(); System.out.println(user1.getFirstName() + user1.getLastName() + " 用户有权限的定义如下:"); processDefinitionList.forEach(pf -> System.out.println(pf.getName())); System.out.println("===================================分隔符=============================="); //2. 根据流程定义查询具有其权限的用户 List<User> userList = identityService.createUserQuery().potentialStarter(processDefinition.getId()).list(); System.out.println("具有流程定义 " + processDefinition.getName() +" 的用户如下"); userList.forEach(user -> System.out.println(user.getFirstName() + user.getLastName())); System.out.println("===================================分隔符=============================="); //3. 根据流程定义查询具有其权限的用户组 List<Group> groupList = identityService.createGroupQuery().potentialStarter(processDefinition.getId()).list(); System.out.println("具有流程定义 " + processDefinition.getName() +" 的用户组如下"); groupList.forEach(group -> System.out.println(group.getName())); //关闭 processEngine.close(); System.exit(0);
- 运行结果
- 查看数据库
- Shiro第二篇【授权、整合Spirng、过滤器】
- Ajax数据的爬取(淘女郎为例)
- 在IDEA中编写Spark的WordCount程序
- Shiro第三篇【授权过滤器、与ehcache整合、验证码、记住我】
- Spark核心RDD、什么是RDD、RDD的属性、创建RDD、RDD的依赖以及缓存、
- Caused by: java.net.ConnectException: Connection refused: master/192.168.3.129:7077
- java.util.zip.ZipException: invalid LOC header (bad signature)
- 递归就这么简单
- Activiti就是这么简单
- WebService就是这么简单
- eclipse中hadoop2.3.0环境部署及在eclipse中直接提交mapreduce任务
- spark on yarn提交任务时一直显示ACCEPTED
- 如何恢复hadoop中被删除的文件
- 多个字段中如何按其中两个进行排序(二次排序)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【STM32F407】第13章 RL-TCPnet V7.X之创建多个TCP客户端
- RecyclerView实现列表倒计时
- wsl设置默认账户为root(ubuntu18.04)
- LeetCode No.14 最长公共前缀
- android异步消息机制 从源码层面解析(2)
- beego解决跨域问题:options请求、axios post请求跨域问题
- Android ListView列表实现倒计时
- [-Flutter 自组篇-] 蛛网图+绘制+动画实践
- Kotlin类型系统竟如此简单
- 以人为本 | Android 11 的消息通知
- RxJava取消订阅的各种方式的实现
- [- Flutter 基础篇 -] ListView的使用
- Emoji表情在Android JNI中的兼容性问题详解
- 一个吸顶Item的简单实现方法分享
- [- Flutter福利篇 -] Hero转场组件共享 — 附赠-路由动画工具类