Springboot +Flowable,任务认领和回退(二)

news2024/10/6 8:40:37

一.简介

有的时候,一个任务节点会存在多个候选人,例如:张三提交一个任务,这个任务即可以由李四处理,又可以由王五处理,那么针对这种多个任务候选人的情况,该如何处理?

二.绘制流程图

首先我们还是使用之前旧的流程图,但是在为 UserTask 设置分配用户的时候,我们设置多个用户,流程图截图如下:
在这里插入图片描述

分配图截图如下:
在这里插入图片描述

设置完成后,载这个流程文件,该流程对应的XML文件,内容如下:

<process id="demo01" name="demo01" isExecutable="true">
  <documentation>demo01</documentation>
  <startEvent id="startEvent1" flowable:initiator="INITATOR" flowable:formFieldValidation="true"></startEvent>
  <userTask id="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" flowable:candidateUsers="javaboy,zhangsan,lisi" flowable:formFieldValidation="true"></userTask>
  <sequenceFlow id="sid-71FB3A81-F753-419D-9A0A-2FC6E5361CED" sourceRef="startEvent1" targetRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3"></sequenceFlow>
  <endEvent id="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></endEvent>
  <sequenceFlow id="sid-DEBE03CD-F247-4EF3-BB67-ABBA94739B0A" sourceRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" targetRef="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></sequenceFlow>
</process>

可以看到,UserTask 中的 flowable:candidateUsers=“javaboy,zhangsan,lisi” 就表示这个 UserTask 由 javaboy、zhangsan 和 lisi 三个用户处理,用户名之间用 , 隔开。

三.认领任务

对于这种有候选人的任务,我们需要先认领,再处理。认领的本质,其实就是给 ACT_RU_TASK 表中,这个 UserTask 记录的 ASSIGNEE_ 字段设置上值。代码如下:

@Test
void test12() {
    List<Task> list = taskService.createTaskQuery().taskCandidateUser("javaboy").list();
    for (Task task : list) {
        taskService.claim(task.getId(),"javaboy");
    }
}

认领之后,再来看下 ACT_RU_TASK 表中的数据,截图如下:
在这里插入图片描述

可以看到,此时 ASSIGNEE_ 字段就有值了,同时 CLAIM_TIME 字段也记录了任务的认领时间。
再来看任务认领执行的 SQL,截图如下:
在这里插入图片描述

四.处理任务

认领后的任务该如何处理,代码如下:

@Test
void test11() {
    List<Task> list = taskService.createTaskQuery().taskAssignee("javaboy").list();
    for (Task task : list) {
        taskService.complete(task.getId());
    }
}

任务执行完成后,ACT_RU_IDENTITYLINK 表中的记录也会随之删除

五.变量与监听器

前面这种方式设置的任务候选人我们是在绘制流程图的时候直接硬编码的,这显然不是一个好办法。如果能通过变量来传递任务的候选人,就会方便很多。

1.候选人变量

在绘制流程图的时候,用变量代替直接指定候选人,截图如下:
在这里插入图片描述

此时,生成的流程 XML 文件中,UserTask 节点的处理人内容如下:

<process id="demo01" name="demo01" isExecutable="true">
  <documentation>demo01</documentation>
  <startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
  <userTask id="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" flowable:candidateUsers="${userIds}" flowable:formFieldValidation="true"></userTask>
  <sequenceFlow id="sid-71FB3A81-F753-419D-9A0A-2FC6E5361CED" sourceRef="startEvent1" targetRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3"></sequenceFlow>
  <endEvent id="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></endEvent>
  <sequenceFlow id="sid-DEBE03CD-F247-4EF3-BB67-ABBA94739B0A" sourceRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" targetRef="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></sequenceFlow>
</process>

UserTask 节点中的 flowable:candidateUsers=“${userIds}” 就表示流程的处理人由 userIds 变量控制

接下来启动流程,注意,此时启动流程需要传递 userIds 变量,代码如下:

@Test
void test01() {
    Map<String, Object> userIds = new HashMap<>();
    userIds.put("userIds", "javaboy,zhangsan,lisi");
    ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01",userIds);
    logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}

多个用户之间,用英文 , 隔开。
流程启动成功后,接下来的操作参考 三、四 点。

2.监听器

也可以通过监听器来为 UserTask 设置多个候选处理人用户,首先我们创建一个监听器,代码如下:

public class MyUserTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        delegateTask.addCandidateUser("javaboy");
        delegateTask.addCandidateUser("zhangsan");
        delegateTask.addCandidateUser("lisi");
    }
}

然后在绘制流程图的时候,删除掉 UserTask 分配的用户,然后重新为 UserTask 设置一个监听器,截图如下:
在这里插入图片描述
然后设置一个在创建 UserTask 的时候触发的监听器,截图如下:
在这里插入图片描述
下载这个流程图对应的 XML 文件,内容如下:

<process id="demo01" name="demo01" isExecutable="true">
  <documentation>demo01</documentation>
  <startEvent id="startEvent1" flowable:initiator="INITATOR" flowable:formFieldValidation="true"></startEvent>
  <userTask id="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" flowable:formFieldValidation="true">
    <extensionElements>
      <flowable:taskListener event="create" class="org.javaboy.flowableidm.MyUserTaskListener"></flowable:taskListener>
    </extensionElements>
  </userTask>
  <sequenceFlow id="sid-71FB3A81-F753-419D-9A0A-2FC6E5361CED" sourceRef="startEvent1" targetRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3"></sequenceFlow>
  <endEvent id="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></endEvent>
  <sequenceFlow id="sid-DEBE03CD-F247-4EF3-BB67-ABBA94739B0A" sourceRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" targetRef="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></sequenceFlow>
</process>

可以看到,在 userTask 节点中,通过 extensionElements 指定了额外的监听器。

这个流程可以直接启动了,启动时也不需要额外的变量。

流程启动成功后,接下来的操作参考 三、四 点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/495502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SuperMap GIS基础产品组件GIS FAQ集锦(2)

SuperMap GIS基础产品组件GIS FAQ集锦&#xff08;2&#xff09; 【iObjects for Spark】读取GDB参数该如何填写&#xff1f; 【解决办法】可参考以下示例&#xff1a; val GDB_params new util.HashMapString, java.io.Serializable GDB_params.put(FeatureRDDProviderParam…

spi 应用层读值为0问题

昨天调SPI遇到读值为0x00&#xff0c;经排查是读写方向的问题。 #include <stdint.h> #include <stdio.h> #include <stdlib.h…

Consensus见闻:雷声大 却不下雨的奧斯汀

前言 由Coindesk举办的Consensus历时3天&#xff0c;于4月28日完美落幕&#xff0c;欧科云链研究院前往美国得克萨斯州奧斯汀参加&#xff0c;本文将分享我们在奧斯汀和Consensus会议中的所见所闻&#xff0c;带你们看一个不一样的奧斯汀。 出品&#xff5c;欧科云链研究院 作…

datagrip连接elasticsearch且进行查询20230506

背景&#xff1a;公司要做一个es的数据存储&#xff0c;然后通过接口进行查询&#xff0c;我在docker下完成了ELK的安装&#xff0c;但是对es还不是很了解&#xff0c;就想着用logstash加载完数据到es中后&#xff0c;在数据库中对es进行查询&#xff0c;发现datagrip是支持连接…

Boosting之Adaboost与GBDT

同质与异质 1.异质模型&#xff1a;把不同类型的算法集成在一起&#xff0c;基础模型要有足够大差异性&#xff08;可以找出最适合当前数据的模型&#xff09; 同质模型&#xff1a;通过一个基础算法生成的同类型学习器。 Boosting概念介绍 Boosting本意就是提升&#xff0…

腾讯云服务器怎么开通端口?以80端口为例轻量和CVM教程合集

腾讯云服务器怎么放通80端口&#xff1f;腾讯云服务器分为云服务器CVM和轻量应用服务器&#xff0c;CVM云服务器在安全组中配置规则开启80端口&#xff0c;轻量应用服务器在防火墙中开通80端口&#xff0c;阿腾云来详细详细说下腾讯云服务器开通80端口教程&#xff1a; 目录 …

【c语言】字符串拼接 | API仿真

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …

linux usb gadget driver代码

本文基于linux-5.4.124 aspeed 2600(BMC)的代码实现来描述arm结构下的gadget driver. 在读之前&#xff0c;我们需要了解什么是usb gadget driver&#xff0c;以及它的作用。 从英文字面上翻译看&#xff0c;usb gadget driver是一个usb小工具驱动。这说了等于没说。实际上&a…

如何通过代码接入手机在网状态 API

引言 在许多场景下&#xff0c;手机号码是一种常用的身份验证信息。而使用手机在网状态 API 可以判断出手机号码是否有效&#xff0c;在一定程度上提高了身份验证的准确性和安全性&#xff0c;它的出现和广泛应用&#xff0c;为各行各业提供了更为便利和高效的解决方案。 本文…

城市夜景照明对于安科瑞智能照明系统的运用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;文章以智能照明控制系统为切入点&#xff0c;介绍了智能照明控制系统在城市夜景照明工程中的应用价值&#xff0c;并结合具体案例分析了城市夜景照明控制管理平台的设计和具体应用。智能照明控制系统…

微软Bing突然爆炸级更新!无需等待人人可用,答案图文并茂

所有人都能上手微软Bing了&#xff01; 今天&#xff0c;微软突然官宣全面开放BingChat&#xff1a; 无需任何等待。只需注册一个账户&#xff0c;首页即可体验。 更关键的是&#xff0c;还有一大堆堪称“家底”的新功能来袭&#xff01; 支持100种语言多模态输出、持续聊天…

控制您的 AWS VPC 终端节点

随着 Amazon Web Services &#xff08;AWS&#xff09; 越来越受欢迎&#xff0c;现在控制您自己的 AWS 虚拟私有云 &#xff08;VPC&#xff09; 终端节点比以往任何时候都更加重要。这可以通过配置和管理 VPC 终端节点中的不同设置来完成。在本文中&#xff0c;我们将讨论为…

yolo目标检测2:yolov1整体思想和网络架构

上一节&#xff1a;https://blog.csdn.net/weixin_39107270/article/details/130408407 概念 You only look once 把检测问题转化成回归问题&#xff0c;一个CNN就搞定了。 2. 核心思想 每个点处有2种候选框&#xff0c;如果候选框内有目标&#xff0c;对候选框进行微调&am…

初学Verilog语言基础笔记整理(实例点灯代码分析)持续更新~

实例&#xff1a;点灯学习 一、Verilog语法学习 1. 参考文章 刚接触Verilog&#xff0c;作为一个硬件小白&#xff0c;只能尝试着去理解&#xff0c;文章未完…持续更新。 参考博客文章&#xff1a; Verilog语言入门学习&#xff08;1&#xff09;Verilog语法【Verilog】一文…

NoSQL自述---衍生过程

NoSQL概述 一.数据存储的演化史 1.单机MySQL的美好年代 在90年代&#xff0c;一个网站的访问量一般都不大&#xff0c;用单个数据库完全可以轻松应付。在那个时候&#xff0c;更多的都是静态网页&#xff0c;动态交互类型的网站不多。 上述架构下&#xff0c;我们来看看数据…

计算机毕业论文内容参考|软件工程|基于java开发汽车销售系统资料

文章目录 导文资料1简述模块与功能总结资料二摘要前言绪论课题背景国内外现状与趋势相关技术与方法介绍导文 如下是一个 Java 实现的汽车销售系统的简单描述,供参考。 计算机毕业论文内容参考|软件工程|基于java开发汽车销售系统资料 资料1 简述 汽车销售系统是专门为汽车销…

jetcache:阿里这款多级缓存框架一定要掌握

0. 引言 之前我们讲解了本地缓存ehcache组件&#xff0c;在实际应用中&#xff0c;并不是单一的使用本地缓存或者redis&#xff0c;更多是组合使用来满足不同的业务场景&#xff0c;于是如何优雅的组合本地缓存和远程缓存就成了我们要研究的问题&#xff0c;而这一点&#xff…

前端002_初始化项目

1、命名和启动项目 将目录名 vue-admin-template-master 重命名为 db-manager-system 将 db-manager-system/package.json 中的 name 值改为 db-manager-system {"name": "db-manager-system","version": "1.0.1","descriptio…

车载搭载SystemUI音频技术,全方位呈现高品质音效

SystemUI概述 SystemUI 是 Android 操作系统中的一个系统服务&#xff0c;主要负责管理和显示系统界面元素&#xff0c;例如状态栏、通知栏、键盘和屏幕截图等。SystemUI 系统服务是系统级别的组件&#xff0c;提供的功能对于用户体验和系统安全性都非常重要。 SystemUI 的主…

KNN中不同距离度量对比和介绍

k近邻算法KNN是一种简单而强大的算法&#xff0c;可用于分类和回归任务。他实现简单&#xff0c;主要依赖不同的距离度量来判断向量间的区别&#xff0c;但是有很多距离度量可以使用&#xff0c;所以本文演示了KNN与三种不同距离度量(Euclidean、Minkowski和Manhattan)的使用。…