创建流程实例

书接上回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(二)相关推荐

  1. springboot+vue 审批工作流集成flowable(springboot实现工作流)

    仿钉钉审批流程图在线绘制.业务申请.审批.流转.委托.催办,springboot集成工作流基础框架 前言 目前市场上有很多开源平台没有整合工作流,即使有,也是价格不菲的商业版,这次推荐的是在一个基础开 ...

  2. camunda工作流开发实战------03 hello world

    一.camunda modeler流程设计器 想要开发工作流hello world ,首先得要有一个流程设计器来设计流程 camunda 提供了流程设计程序 camunda modeler 下载地址: ...

  3. camunda工作流开发实战------04 请假流程实例

    接着上篇hello world 说,之前的流程是一个简单的工作流程 不符合业务逻辑,那么稍微正常的流程图应该怎么设计呢? 首先请假是要设置启动人为申请人--填写请假单--到领导审批--审批之通过之后系 ...

  4. camunda工作流

    camunda工作流使用和api 一:先画流程图,如下 二:代码实现 三:api调用 四:流程图页面地址 一:先画流程图,如下 流程图详解如下: 子流程详解如下: 申请人详解: 专业核查详解: 核查不 ...

  5. Camunda工作流引擎三

    本篇继续拓宽对 Camunda 工作流的学习! <Camunda 工作流引擎一> <Camunda 工作流引擎二> 提要 文章目录 提要 正文 组任务 网关 排他网关 并行网关 ...

  6. 一、Camunda工作流的学习路线(开局一把刀,学完后青铜变王者)

    前言 我写这篇文章的目的是为了将camunda工作流的相关知识系统化,目前网上的文章知识点很散,有些文章也不适合目前的企业级项目开发. 学习路线: 一.如果你是小白,你需要自己去理解什么是工作流?其作 ...

  7. Camunda工作流引擎一

    实习工作中需要用到工作流引擎,去实现业务审批流的功能模块,由于 Flowable 不支持 MariaDB (重要原因之一),所以项目中选择了 Camunda 工作流引擎. 由于没有接触过工作流引擎,所 ...

  8. spring-boot(二)

    学习文章来自:http://www.ityouknow.com/spring-boot.html web开发 spring boot web开发非常的简单,其中包括常用的json输出.filters. ...

  9. zookeeper-常用命令,集成springboot,分布式锁实现和原理 ,dock集群zookeeper搭建,

    (一)zookeeper数据模型 树形结构 每个节点里面保存信息 节点拥有子节点 节点是临时的也可以是持久的 四大节点 PERSISTENT-持久化目录节点 客户端与zookeeper断开连接后,该节 ...

最新文章

  1. R语言explore包进行探索性数据分析实战(EDA、exploratory data analysis):基于iris数据集
  2. 迈向智慧化 物联网规模应用不断拓展
  3. r230/r250/m200
  4. JUC多线程:线程池的创建及工作原理 和 Executor 框架
  5. 《Java 进阶之路》 下--推荐书籍
  6. spring mvc Spring Data Redis RedisTemplate [转]
  7. php限制注册频率,php如何限制某个ip提交的次数
  8. 商家 APP 如何接入新版支付宝支付,老版本商家如何升级
  9. DPDK无锁队列rte_ring相关代码及示例程序(rte_ring.h,rte_ring.c,main.c,makefile)
  10. Bzoj3576 [Hnoi2014]江南乐
  11. Apache Flink CDC 批流融合技术原理分析
  12. STM32用热敏电阻测温
  13. WinCC V7.4 过程值归档概述及流程演示
  14. tibco rv java实例_Tibco介绍及应用.pptx
  15. QA | R做生存分析如何取最佳cutoff(截断)
  16. Tomcat和Springboot自启动脚本
  17. 热烈祝贺“UTONMOS第一届公会会长圆桌会议”圆满举行
  18. 【Demo见真章】投稿赢HarmonyOS手机Beta公测名额
  19. 大话数据结构 -- 查找
  20. 工作中的基础git操作

热门文章

  1. 物联网开发笔记(23)- 使用Micropython开发ESP32开发板之控制4位数码管
  2. 算法---设计推特(Kotlin)
  3. 浪潮nf5180m5服务器安装系统,浪潮(Inspur)英信服务器NF5180M5
  4. 怎样将cad布局导出来_CAD布局如何导出模型图?
  5. springboot整合jwt与vue的后端管理系统1
  6. 老司机php源码,JeRuen
  7. 系统运维:北京某万相融通高级工程师笔试题
  8. 电子商务思维导图精品荟萃:电子商务思维导图大全
  9. 身份证正则表达式 完美支持闰年
  10. 建筑设备自动化——I/O接口数字量与模拟量