Springboot +Flowable,设置任务处理人的四种方式(一)

news2024/12/23 18:56:44

一.简介

学习下UserTask 设置用户的三种方式,至于如何设置用户组,下篇文章再聊。

现在,假设我有如下一个简单的流程图:
在这里插入图片描述
那么该如何设置这个用户节点的处理人?

二.第一种:指定具体用户

第一种方式,是我们在绘制流程图的时候,可以选中这个节点,然后直接设置流程的处理人,截图如下:

在这里插入图片描述
然后在打开的窗口中选择固定值,设置具体分配的用户是 javaboy,如下图:
在这里插入图片描述
现在这个节点就固定的由一个名为 javaboy 的用户去处理了。
对应的 XML 文件如下:

<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:assignee="javaboy" flowable:formFieldValidation="true">
    <extensionElements>
      <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
    </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>

在上面这段 XML 中,可以看到 UserTask 节点中有一个 flowable:assignee=“javaboy”,这句话就是设置这个 UserTask 的处理人。

接下来,我们部署并启动这个流程(具体的部署启动方式可以参考本系列之前的文章),启动之后,我们可以在数据库的 ACT_RU_TASK 表中看到,这个 UserTask 的处理人是 javaboy,如下图:

根据上面这段代码,执行结果如下:在这里插入图片描述
现在可以通过 Java 代码去查询 javaboy 需要处理的 UserTask 了,代码如下:

@Autowired
TaskService taskService;
@Test
void test11() {
    List<Task> list = taskService.createTaskQuery().taskAssignee("javaboy").list();
    for (Task task : list) {
        logger.info("id:{},name:{}",task.getId(),task.getName());
    }
}

在这里插入图片描述
查询到这个任务之后,javaboy 有两种选择:

  1. 将这个任务指定给另外一个人,例如 zhangsan。
  2. 自己处理。

1.重新指定任务处理人

假设 javaboy 查询到自己的任务之后,想把这个任务交给 zhangsan 去处理,代码如下:

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

这行代码执行完成后,我们看数据库中的 ACT_RU_TASK 表,还是刚才那条记录,但是处理人变了,变成了 zhangsan,截图如下:
在这里插入图片描述
版本号从 1 变为 2 了,说明这条记录被更新过了,处理人则从 javaboy 变为了 zhangsan。

最后再来看下这个操作所执行的 SQL,来验证一下前面的结论:
在这里插入图片描述

2.自己处理

如果 javaboy 想自己处理这个任务也是可以的,代码如下:

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

处理完成后,ACT_RU_TASK 表中的记录也会被自动删除掉(执行过的 UserTask 会被自动删除)。

这种方式是指定了具体的用户,很显然这种硬编码的方式使用起来很不方便,我们需要的是能够动态指定任务处理人的方式。

三.第二种:通过变量设置

如果想动态指定 UserTask 的处理人,则可以通过变量来实现,在绘制流程图的时候,还是指定流程的具体处理人,但是在指定的时候,使用EL变量代替,截图如下:
在这里插入图片描述
这里的 #{manager} 表示这个 UserTask 由一个名为 manager 的变量来指定,此时的 XML 文件的代码如下:

<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:assignee="#{manager}" flowable:formFieldValidation="true">
    <extensionElements>
      <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
    </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 节点中的 flowable:assignee=“#{manager}” 就表示这个 UserTask 的处理人由 manager 变量指定。

对于这样的流程,我们在上一个节点处就需要指定下一个节点的处理人,对于当前案例来说,当然是要在流程启动的时候,指定这个 UserTask 的处理人,代码如下:

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

当流程启动成功之后,去查看 ACT_RU_TASK 表,就可以看到,有一个待处理的 UserTask,处理人是 javaboy,截图如下:

在这里插入图片描述
能看到这条记录,就说明这个 UserTask 的处理人我们已经设置成功了。

接下来具体的处理逻辑,则参考第二大点的第一二小点。

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

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

相关文章

电路中噪声来源

电路包括不同的部件和芯片&#xff0c;所有都有可能成为噪声的来源。例如&#xff0c;电阻会带来热噪声&#xff0c;这个噪声为宽频噪声&#xff0c;几乎涵盖所有频率范围&#xff1b;运算放大器其芯片内部会产生噪声&#xff1b;而 ADC产生的量化噪声相较于其他器件&#xff0…

【】右值引用完美转发

文章目录 右值引用和左值引用左值和右值概念左值引用 && 右值引用右值引用使用场景和意义左值引用的使用场景**左值引用的短板:**右值引用和移动语义STL容器增加的接口move函数右值引用的其他使用场景 完美转发万能引用完美转发保持值的属性完美转发的使用场景 右值引用…

【Linux】进程信号 --- 信号产生 信号递达和阻塞 信号捕捉

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 文章目录 一、预备知识二、信号产生1. 通过终端按键产生信号1.1 signal()1.2 core dump标志位、核心存储文件 2.通过系统调用向进程发送信号3.由软件条件产生信号3.1 alarm函数和SIGALRM信号…

vue3通过ref拿element弹框中的组件问题

写在<el-dialog>中的组件&#xff0c;在一开始&#xff0c;弹框没有弹出来的时候&#xff0c;<el-dialog>中的组件是没有被渲染出来的&#xff0c;因此在<el-dialog>中使用ref标记某个组件&#xff0c;在el-dialog没有被渲染出来之前去拿的话&#xff0c;是拿…

ml常见代码片段

常用ML代码片段 变换一列 new_df[brand] new_df[prod_name].apply(lambda x: x.split()[0])变换2列 new_df[chip_total_sales] new_df.apply(lambda x: x[total_sales] * x[is_chip], axis 1) # 重要的是axis1groupby 计数&#xff0c;求和&#xff0c;取第一个值&#x…

C语言起源、特性和发展历程

本文从ALGOL 60语言谈起&#xff0c;简述C语言的起源和发展历程&#xff0c;然后对C语言的一些特性做了探讨&#xff0c;最后说说C语言为什么在众多编程语言中&#xff0c;起到了承上启下的作用。 本文介绍以下内容&#xff1a; C语言的起源C语言的发展C语言的特性C语言的重要…

外卖项目优化-01-redis缓存短信验证码、菜品数据

文章目录 外卖项目优化-01课程内容前言1. 环境搭建1.1 版本控制解决branch和tag命名冲突 1.2 环境准备 2. 缓存短信验证码2.1 思路分析2.2 代码改造2.3 功能测试 3. 缓存菜品信息3.1 实现思路3.2 代码改造3.2.1 查询菜品缓存3.2.2 清理菜品缓存 3.3 功能测试3.4 提交并推送代码…

AutoGPT安装教程

最近安装AutoGPT时遇到了一些问题&#xff0c;写下这篇文章记录一下 1 下载AutoGPT AutoGPT链接&#xff1a;https://github.com/Significant-Gravitas/Auto-GPT/tree/v0.2.2 下载AutoGPT 推荐下载stable 版本 2 申请openai 的api key 获取api的key&#xff0c;这里就不介…

【超算/先进计算学习】日报8

目录 今日已完成任务列表遇到的问题及解决方案任务完成详细笔记阶段一阶段二阶段三阶段四 对自己的表现是否满意简述下次计划其他反馈 今日已完成任务列表 超算/高性能计算总结 遇到的问题及解决方案 无 任务完成详细笔记 阶段一 在学习的第一阶段&#xff0c;我们首先对需要…

ChatGPT+智能家居在AWE引热议 OpenCPU成家电产业智能化降本提速引擎

作为家电行业的风向标和全球三大消费电子展之一&#xff0c;4月27日-30日&#xff0c;以“智科技、创未来”为主题的AWE 2023在上海新国际博览中心举行&#xff0c;本届展会展现了科技、场景等创新成果&#xff0c;为我们揭示家电与消费电子的发展方向。今年展馆规模扩大至14个…

【pytest里的参数化:看几个例子就够了!】

参数化多个参数&#xff1a;可以使用多个参数来参数化测试。例如&#xff1a; import pytestpytest.mark.parametrize("x, y, expected", [(1, 2, 3),(3, 4, 7),(5, 6, 11), ]) def test_addition(x, y, expected):assert x y expected参数化列表&#xff1a;可以…

轻叶H5营销单页,让你的营销更加清爽高效

网络营销就是营销企业品牌形象、产品信息发布、优惠促销活动&#xff0c;最终目的就是争抢流量和客户。现在为了吸引流量&#xff0c;各种营销方式、广告玩法层出不穷&#xff0c;成本投入大&#xff0c;带来的转化不一定好。今天&#xff0c;我们要来讲一讲H5营销单页。 H5营销…

项目管理软件project下载安装配置图文教程

目录 前言 配置安装过程 总结 前言 Project是一种计划、组织和管理任务的工具&#xff0c;通常用于团队协作和项目管理。它可以帮助用户创建任务列表、分配任务、设置截止日期、跟踪进度、分析数据等。Project还可以生成各种报告&#xff0c;如甘特图、资源使用情况、任务分…

稀疏矩阵存储格式总结

稀疏矩阵是指矩阵中的元素大部分是0的矩阵&#xff0c;实际问题中大规模矩阵基本上都是稀疏矩阵&#xff0c;很多稀疏度在90%甚至99%以上,大规模的稀疏造成了大量无效数据的计算和存储资源占用&#xff0c;也无法有效的载入有限内存计算。因此我们需要有高效的稀疏矩阵存储格式…

SpringCloud:ElasticSearch之数据同步

elasticsearch中的酒店数据来自于mysql数据库&#xff0c;因此mysql数据发生改变时&#xff0c;elasticsearch也必须跟着改变&#xff0c;这个就是elasticsearch与mysql之间的数据同步。 1.思路分析 常见的数据同步方案有三种&#xff1a; 同步调用异步通知监听binlog 1.1.同…

Nacos配置中心的详解与搭建

Namespace 简介 用于进行租户粒度的配置隔离&#xff0c;不同的命名空间下&#xff0c;可以存在相同的 Group 或 Data ID 的配置 配置Namespace 点击nacos的命名空间——点击新建命名空间 开发环境【dev】测试环境【test】正式环境【prod】 DataID 简介 Data ID 通常用于…

Node.js 下载与安装教程

文章目录 Node.js 下载Node.js 安装npm 配置配置node_path修改用户变量更换npm源为淘宝镜像全局安装基于淘宝源的cnpm Node.js 下载 1.进入nodejs官网&#xff1a;https://nodejs.org/en 2.单击downloads 3.此时滑动滚动条&#xff0c;找到并单击 previous release 4.在此页…

<C++>lesson1.C++入门上

文章目录 1. C关键字(C98)&#x1f49a;2. 命名空间&#x1f90e;2.1 命名空间定义2.2命名空间的使用 3. C输入/输出&#x1f5a4;4.缺省参数&#x1f499;4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载❤️5.1 函数重载的概念5.2 C支持函数重载的原理 6. 引用&#x1f49c;6.…

Day4_Springboot集成Mybatis

上一节使用springboot框架搭建了项目&#xff0c;并创建了数据库user表&#xff0c;接下来集成mybatis对用户表实现增删改查操作~~~~ 目录 SpringBootApplication.java 创建model/entity文件夹&#xff0c;存放实体类 UserDao.java UserController.java 浏览器Json插件&am…

Leetcode刷题日志3.0

目录 前言&#xff1a; 1.相对名次​​​​​​ 2.学生出勤记录 I 3.重塑矩阵 4.分糖果 5.最长和谐子序列 6.种花问题 前言&#xff1a; 今天我就分享一下最近在leetcode刷到的题&#xff0c;希望对大家有所帮助。编程语言&#xff1a;Python3。好了废话不多讲了&…