【Camunda五】Camunda常用接口整合
以下所有接口均为单租户情况下,多租户可查看专栏中的系列文章。
1、部署BPMN文件
camunda将后缀为 .bpmn20.xml或.bpmn 的文件视为bpmn文件。
//这种就是加载项目resources目录下的one.bpmn文件
Deployment deploy = repositoryService.createDeployment().name(name).addClasspathResource("one.bpmn").deploy();
//这种就可以使用自己拼接的xml字符串
Deployment deploy = repositoryService.createDeployment().name(definitionName).addString(名称+".bpmn",resource).deploy();
2、启动流程实例
两种方式,每种方式又提供了不同的重载方法,可以应对各种情况。有不懂的看看专栏文章或者评论区提问。
2.1指定版本
这种方式是使用给定流程定义id在流程定义的精确指定版本中启动一个新流程实例。
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId);
//这里传入businessKey是方便后续可以只查某一类业务的待办
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId,businessKey);
//传入一些参数
Map<String, Object> map = new HashMap<>(2);
map.put("initiator", processInitiator);
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId,businessKey,variables);String processInstanceId = processInstance.getProcessInstanceId();
2.2最新版本
这种方式是在对应流程定义的对新版本中启动一个流程实例。
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionId);
//这里传入businessKey是方便后续可以只查某一类业务的待办
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionId,businessKey);
//传入一些参数
Map<String, Object> map = new HashMap<>(2);
map.put("initiator", processInitiator);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionId,businessKey,variables);
String processInstanceId = processInstance.getProcessInstanceId();
上述的传参在整个流程实例运行过程中都是可以获取到的,我们暂且称之为 全局参数。
3、查询待办
根据不同的业务指定人员来查询待办任务,比如:需要查询在合同签订业务中我的待办任务
List<Task> taskList = taskService.createTaskQuery().processInstanceBusinessKey(businessKey).taskAssignee(assignee).list();
//processInstanceBusinessKeyIn() 也就是多个业务key
注意:这里因为Camunda版本的问题,有的版本是不能直接返回得到的list,需要自己写个类转一下
4、完成待办
这个很简单,从上述查询结果中拿到taskId,直接调方法就可以了。
taskService.complete(taskId);
5、查询已办
这里需要根据不同的需求来处理,比如或签节点有A,B,C三个审批人,A审批同意后,该节点通过,那么A对应的任务它的DELETE_REASON是completed,而B、C的就是deleted。
严格意义上说B、C其实没有处理自己的待办任务,所以查询已办时应该排除。
List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery().processInstanceBusinessKey(businessKey).taskAssignee(assignee).finished().taskDeleteReason("completed").list();
6、转办
A把自己的待办任务转给B,这里除了传入taskId,还需要传入B的id。这里建议使用第二种,第一种按照官网的意思被委托人必须使用resolveTask(String)向任务所有者报告,这里存在一些权限的问题,当然我在使用过程中没加那些权限,所以可以正常使用。
taskService.delegateTask(taskId, userId);
//或
taskService.setAssignee("1600669540055736416","10087");
比如把这个任务转办给用户10086
7、流程实例运行状态
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
//判断processInstance是否为null 是null就说明流程实例结束了
8、流程实例某节点上待办任务数
List<Task> taskList = taskService.createTaskQuery().processInstanceId("流程实例id").taskDefinitionKey("节点id").list();
//或者
List<HistoricTaskInstance> taskList = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).taskDefinitionKey("节点id").unfinished().list();
9、流程实例某节点上所有的审批人
List<HistoricTaskInstance> taskList = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).taskDefinitionKey(nodeId).list();
//这里判空一下
Set<String> assigneeSet = taskList.stream().map(HistoricTaskInstance::getAssignee).collect(Collectors.toSet());
10、查询流程定义相关数据
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId("流程定义id").singleResult();
//或者
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("流程定义key").processDefinitionVersion(版本号).singleResult();.latestVersion()就是最新版本
11、流程实例的挂起与激活
流程实例挂起后,仅可以更改变量、添加属性。完成、转办、修改审批人都是不支持的,重新激活后就可以正常使用了。
//挂起
runtimeService.suspendProcessInstanceById("流程实例id");
//激活
runtimeService.activateProcessInstanceById("流程实例id");
12、重启流程实例
在流程实例终止后,其历史数据仍然存在,并且可以访问这些数据来恢复流程实例,前提是历史级别设置为FULL
runtimeService.restartProcessInstances("流程定义id").startAfterActivity("节点id").processInstanceIds("流程实例id").execute();
//startBeforeActivity(String activityId)
//startAfterActivity(String activityId)
//startTransition(String transitionId)
13、修改流程实例
虽然流程定义中已经定义了流程要按某种顺序执行,但有时需要灵活地再次启动活动或取消正在运行的活动。
//获取当前运行的环节实例
ActivityInstance activity = runtimeService.getActivityInstance("流程实例id");
runtimeService.createProcessInstanceModification("流程实例id").startBeforeActivity("节点id")//设置参数 .setVariable("approver", "joe")//取消正在运行的环节实例 .cancelAllForActivity(activity.getId()).execute();//startBeforeActivity(String activityId)
//startBeforeActivity(String activityId, String ancestorActivityInstanceId)
//startAfterActivity(String activityId)
//startAfterActivity(String activityId, String ancestorActivityInstanceId)
//startTransition(String transitionId)
//startTransition(String transition, String ancestorActivityInstanceId)
//cancelActivityInstance(String activityInstanceId)
//cancelTransitionInstance(String transitionInstanceId)
//cancelAllForActivity(String activityId)
【Camunda五】Camunda常用接口整合相关推荐
- springBoot整合rabbitmq并测试五种常用模型
之前我们记录了原生java代码使用rabbitmq的方法,很简单,类似于原生jdbc代码一样,将连接对象抽离出来作为工具类,生产者和消费者通过工具类获取连接对象,进而获取通道对象,再注册交换机或者是队 ...
- Camunda教程|Camunda视频
Camunda教程|Camunda视频 因为Camunda资料是在是太少了,为此分享牛推出了一套Camunda视频 ,方便大家快速入手Camunda. 目录 因为Camunda资料是在是太少了,为此分 ...
- HTML5 Canvas像素处理常用接口
内容概要:本文通过简单的代码实例,以及略猥琐的图片demo,展示了canvas在图像像素数据操作方面的常用接口.至于如何利用这几个接口实现更复杂的效果,则会在后续章节里继续讲述. 一.canvas图片 ...
- 【LeetCode 总结】Leetcode 题型分类总结、索引与常用接口函数
文章目录 零. Java 常用接口函数 一. 动态规划 二. 链表 三. 哈希表 四. 滑动窗口 五. 字符串 六. DFS.BFS 七. 二分法 八. 二叉树 九. 偏数学.过目不忘 and 原地算 ...
- MVC教程第五篇:MVC整合Ajax
MVC教程第五篇:MVC整合Ajax 摘要 本文将从完成"输入数据验证"这个功能出发,逐渐展开ASP.NET MVC与Ajax结合的方法.首先,本文将使用ASP.NET M ...
- 逗比的输入法实现(二):基础概念和常用接口
为什么叫 Meow?因为这是给猫用的输入法... 目录 (一):基本情况 (二):基础概念和常用接口 (三):整体构架 (四):编辑和候选 (五):界面管理和无界面模式 (六):词库和候选算法 (七) ...
- Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)
Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...
- JDBC—01—JDBC简介;JDBC常用接口与类;
一. JDBC 简介 1 什么是 JDBC JDBC(Java DataBase Connectivity)java 数据库连接 是 JavaEE 平台下的技术规范 定义了在 Java 语言中连接数据 ...
- 盘点springmvc的常用接口
2019独角兽企业重金招聘Python工程师标准>>> 盘点springmvc的常用接口### springmvc是如今非常流行的web开发框架之一.我个人非常喜欢它约定优于配置的理 ...
最新文章
- 从零开始学数据结构和算法(二)线性表的链式存储结构
- SparkSQL之操作Mysql
- 【FFmpeg】FFmpeg常用基本命令(转载)
- 职教云打卡可以补签吗_雁城“网红路”升级改造,部分红叶李已被挖出,以后还可以在此地打卡吗?...
- python数组切片赋值_基于numpy中数组元素的切片复制方法
- java 变位词,[Java教程]变位词的查找(下)
- ServletContextListener 和HttpSessionListener 的自我理解
- php 外包 上海,== | php外包与php技术服务商
- keyshot pro 10报许可证(*.lic)对该计算机无效解决办法
- 【RDMA】IBV_SEND_INLINE和IBV_SEND_SIGNALED的原理|RDMA小消息通信性能优化
- 一键搞定身份证复印 多功能应用全面满足工作组需求
- 浅谈幼儿园计算机论文,浅谈幼儿园科学教育活动中,计算机的辅助教学
- PhotoShop 切片、标尺使用
- EF数据迁移命令总结
- linux上u盘怎么加密,linux使用luks加密硬盘或u盘
- linux命令发请求,Linux命令发送Http的get或post请求(curl和wget两种方法)
- 【肺实质分割】基于主动轮廓模型和贝叶斯方法识别实现胸膜旁肺实质分割附matlab代码
- 笔记本电脑使用电池时屏幕不停的更改亮度 - 解决方案
- java 鱼眼照片的矫正_使用OpenCV校准鱼眼镜头
- 深度对比 Python 与 Java 的区别(一)
热门文章
- 山西python培训机构
- php iphone下载文件,如何使用MIME协议配合表单在iphone手机上下载文件?
- 7年7个主管,我是如何在支付宝从P5升P7的?
- Form表单实现异步的提交
- layui table 表格模板按钮的实例代码
- 全栈式中间件助党政、教育、医疗行业开新局、筑新基
- 最新emoji表情代码大全_2020父亲节快乐祝福语大全简短 最新温馨的父子节动态表情图片...
- Android WIFI扫描时延
- 15 Function Object
- go kegg_GO 和 KEGG 的区别 | GO KEGG数据库用法 | 基因集功能注释 | 代谢通路富集