Camunda工作流集成SpringBoot(二)
创建流程实例
书接上回Camunda工作流集成SpringBoot(一)
注册流程相当于java中创建一个Class 后续的流程相当于该流程的一个一个的实例
首先需要给大家展示一下流程图的xml文件
后续我们会通过name创建流程类,通过id创建流程实例所以不要弄混了
@AutowiredRepositoryService repositoryService;/*** 注册流程**/@Testpublic void registerProcesses(){Deployment deployment = repositoryService.createDeployment().name("studyCamunda").addClasspathResource("BPMN/study.bpmn20.xml").deploy();System.out.println("部署ID: " + deployment.getId());System.out.println("部署名称: " + deployment.getName());}
创建实例对象
@AutowiredRuntimeService runtimeService;@Testpublic void createProcesses(){ProcessInstance studyCamunda = runtimeService.startProcessInstanceByKey("Process_0228vjo");System.out.println("流程实例的ProcessInstanceId: " + studyCamunda.getId());System.out.println("流程实例的ProcessDefinitionId: " + studyCamunda.getProcessDefinitionId());}
再次打开控制台就可以发现你创建的流程实例
拾取任务,完成任务
那么流程示例怎么往下走呢
@AutowiredTaskService taskService;@Testpublic void tasksOfProcesses(){// 获取ProcessInstance的列表List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().processDefinitionKey("Process_0228vjo").active().list();if (processInstanceList.isEmpty()){throw new RuntimeException("没有流程实例!");}// 只获取一个流程实例进行(强制)拾取并完成操作ProcessInstance processInstance = processInstanceList.get(0);// 查询taskTask task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).active().singleResult();// 强制拾取操作//taskService.setAssignee(task.getId(),"user");// 完成操作if (task.getAssignee().equals("zhangsan"))//完成任务---张三提交请假申请taskService.complete(task.getId());}
ok 目前的流程应该终于跑在到了经理的位置
网关
首先先声明网关虽然是一个节点 但是流程是不停留在网关节点上的,是网关的前面的节点拥有决策权
由于我在画图的时候,网关这一块的条件已经加上了,也就是flag这个字符串为‘true’往用户节点走,反之则往sendTask走
那么经理这个节点的代码实现就需要一个map
@AutowiredTaskService taskService;@Testpublic void tasksOfProcesses(){// 获取ProcessInstance的列表List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().processDefinitionKey("Process_0228vjo").active().list();if (processInstanceList.isEmpty()){throw new RuntimeException("没有流程实例!");}// 只获取一个流程实例进行(强制)拾取并完成操作ProcessInstance processInstance = processInstanceList.get(0);// 查询taskTask task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).active().singleResult();if(task.getAssignee().equals('jack')){// 完成操作HashMap<String, Object> stringStringHashMap = new HashMap<>();//经理的操作--同意或者不同意stringStringHashMap.put("flag","true");taskService.complete(task.getId(),stringStringHashMap);}}
流程来到了财务。。
SendTask
发送任务节点需要挂载到某一个java类
实现JavaDelegete接口节点一旦false 则会触发到execute方法
这里的.createMessageCorrelation(“message”)中配置了上面流程图中的Message Name填写字符串。
而.processInstanceBusinessKey(“messageBusinessKey”)中填写了一个特定的业务key,方便找到特定的Receive Task流程。
package org.example.email;import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;public class SendEmail implements JavaDelegate {@Overridepublic void execute(DelegateExecution delegateExecution) throws Exception {ProcessEngineServices processEngineServices = delegateExecution.getProcessEngineServices();//可以获取到RuntimeServiceRuntimeService runtimeService = processEngineServices.getRuntimeService();}
}
再来看一下DelegateExecution这个类内部的属性
/** execution Id */String getId();/** 流程实例id*/String getProcessInstanceId();/** 这个比较有用 主要就是start、end、take */String getEventName();/*** 业务id,已经废弃的用法*/ String getBusinessKey();/*** 业务id */String getProcessBusinessKey();/*** 流程定义id*/String getProcessDefinitionId();/*** 获取父id,并发的时候有用*/String getParentId();/*** 获取当前的 Activityid*/String getCurrentActivityId();/*** 获取当前的 Activity name*/String getCurrentActivityName();/*** 获取TenantId 当有多个TenantId 有用*/String getTenantId();/*** 这个非常有用吧。当拿到EngineServices 对象所有的xxxService都可以拿到。*/EngineServices getEngineServices();
改一下上面经理同意的代码
@AutowiredTaskService taskService;@Testpublic void tasksOfProcesses(){// 获取ProcessInstance的列表List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().processDefinitionKey("Process_0228vjo").active().list();if (processInstanceList.isEmpty()){throw new RuntimeException("没有流程实例!");}// 只获取一个流程实例进行(强制)拾取并完成操作ProcessInstance processInstance = processInstanceList.get(0);// 查询taskTask task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).active().singleResult();if(task.getAssignee().equals('jack')){// 完成操作HashMap<String, Object> stringStringHashMap = new HashMap<>();//经理的操作--不同意stringStringHashMap.put("flag","false");taskService.complete(task.getId(),stringStringHashMap);}}
经理的节点走完会自动跳进SendTask execute方法,sendTask节点在流程中也是不停留的,execute执行完当前active的节点直接就到了它指向的节点
删除流程实例
@Testpublic void deleteProcessInstance(){List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().processDefinitionKey("Process_0228vjo").active().list();for (ProcessInstance processInstance : processInstanceList) {//删除流程实例runtimeService.deleteProcessInstance(processInstance.getProcessInstanceId(),"删除测试");}}
总结
接下来下面会说一下 参数在节点中的传递,监听等操作,以及更为复杂的bpmn流程图 佛系更新中
Camunda工作流集成SpringBoot(二)相关推荐
- springboot+vue 审批工作流集成flowable(springboot实现工作流)
仿钉钉审批流程图在线绘制.业务申请.审批.流转.委托.催办,springboot集成工作流基础框架 前言 目前市场上有很多开源平台没有整合工作流,即使有,也是价格不菲的商业版,这次推荐的是在一个基础开 ...
- camunda工作流开发实战------03 hello world
一.camunda modeler流程设计器 想要开发工作流hello world ,首先得要有一个流程设计器来设计流程 camunda 提供了流程设计程序 camunda modeler 下载地址: ...
- camunda工作流开发实战------04 请假流程实例
接着上篇hello world 说,之前的流程是一个简单的工作流程 不符合业务逻辑,那么稍微正常的流程图应该怎么设计呢? 首先请假是要设置启动人为申请人--填写请假单--到领导审批--审批之通过之后系 ...
- camunda工作流
camunda工作流使用和api 一:先画流程图,如下 二:代码实现 三:api调用 四:流程图页面地址 一:先画流程图,如下 流程图详解如下: 子流程详解如下: 申请人详解: 专业核查详解: 核查不 ...
- Camunda工作流引擎三
本篇继续拓宽对 Camunda 工作流的学习! <Camunda 工作流引擎一> <Camunda 工作流引擎二> 提要 文章目录 提要 正文 组任务 网关 排他网关 并行网关 ...
- 一、Camunda工作流的学习路线(开局一把刀,学完后青铜变王者)
前言 我写这篇文章的目的是为了将camunda工作流的相关知识系统化,目前网上的文章知识点很散,有些文章也不适合目前的企业级项目开发. 学习路线: 一.如果你是小白,你需要自己去理解什么是工作流?其作 ...
- Camunda工作流引擎一
实习工作中需要用到工作流引擎,去实现业务审批流的功能模块,由于 Flowable 不支持 MariaDB (重要原因之一),所以项目中选择了 Camunda 工作流引擎. 由于没有接触过工作流引擎,所 ...
- spring-boot(二)
学习文章来自:http://www.ityouknow.com/spring-boot.html web开发 spring boot web开发非常的简单,其中包括常用的json输出.filters. ...
- zookeeper-常用命令,集成springboot,分布式锁实现和原理 ,dock集群zookeeper搭建,
(一)zookeeper数据模型 树形结构 每个节点里面保存信息 节点拥有子节点 节点是临时的也可以是持久的 四大节点 PERSISTENT-持久化目录节点 客户端与zookeeper断开连接后,该节 ...
最新文章
- R语言explore包进行探索性数据分析实战(EDA、exploratory data analysis):基于iris数据集
- 迈向智慧化 物联网规模应用不断拓展
- r230/r250/m200
- JUC多线程:线程池的创建及工作原理 和 Executor 框架
- 《Java 进阶之路》 下--推荐书籍
- spring mvc Spring Data Redis RedisTemplate [转]
- php限制注册频率,php如何限制某个ip提交的次数
- 商家 APP 如何接入新版支付宝支付,老版本商家如何升级
- DPDK无锁队列rte_ring相关代码及示例程序(rte_ring.h,rte_ring.c,main.c,makefile)
- Bzoj3576 [Hnoi2014]江南乐
- Apache Flink CDC 批流融合技术原理分析
- STM32用热敏电阻测温
- WinCC V7.4 过程值归档概述及流程演示
- tibco rv java实例_Tibco介绍及应用.pptx
- QA | R做生存分析如何取最佳cutoff(截断)
- Tomcat和Springboot自启动脚本
- 热烈祝贺“UTONMOS第一届公会会长圆桌会议”圆满举行
- 【Demo见真章】投稿赢HarmonyOS手机Beta公测名额
- 大话数据结构 -- 查找
- 工作中的基础git操作
热门文章
- 物联网开发笔记(23)- 使用Micropython开发ESP32开发板之控制4位数码管
- 算法---设计推特(Kotlin)
- 浪潮nf5180m5服务器安装系统,浪潮(Inspur)英信服务器NF5180M5
- 怎样将cad布局导出来_CAD布局如何导出模型图?
- springboot整合jwt与vue的后端管理系统1
- 老司机php源码,JeRuen
- 系统运维:北京某万相融通高级工程师笔试题
- 电子商务思维导图精品荟萃:电子商务思维导图大全
- 身份证正则表达式 完美支持闰年
- 建筑设备自动化——I/O接口数字量与模拟量