【Flowable】Flowable任务分配和流程变量

news2024/12/22 20:17:27

1.任务分配

(1).固定分配

固定分配就是我们前面介绍的,在绘制流程图或者直接在流程文件中通过Assignee来指定的方式
在这里插入图片描述
在这里插入图片描述

(2).表达式分配

Flowable使用UEL进行表达式解析。UEL代表Unified Expression Language,是EE6规范的一部分.Flowable支持两种UEL表达式: UEL-value 和UEL-method

1).值表达式

值表达式 Value expression: 解析为一个值。默认情况下,所有流程变量都可以使用。(若使用Spring)所有的Spring bean也可以用在表达式里。例如

${myVar}
${myBean.myProperty}

案例讲解:
在这里插入图片描述
可以看到通过表达式处理的效果
在这里插入图片描述
先部署流程,然后在启动流程实例的时候绑定表达式对应的值

/**
     * 启动流程实例
     */
    @Test
    public void testRunProcess(){

        // 获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 启动流程实例通过 RuntimeService 对象
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 设置 assignee 的取值
        Map<String,Object> variables = new HashMap<>();
        variables.put("assignee0","张三") ;
        variables.put("assignee1","李四"); 
        // 启动流程实例,第一个参数是流程定义的id
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceById("MyHolidayUI:1:4", variables);// 启动流程实例
        // 输出相关的流程实例信息
        System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例的ID:" + processInstance.getId());
        System.out.println("当前活动的ID:" + processInstance.getActivityId());
    }

在流程变量表中我们可以看到对应的流程变量信息
在这里插入图片描述

同时在Task表中,可以看到流程当前的分配人是张三,说明UEL表达式被解析了
在这里插入图片描述

2).方法表达式

方法表达式 Method expression: 调用一个方法,可以带或不带参数。**当调用不带参数的方法时,要确保在方法名后添加空括号(以避免与值表达式混淆)。**传递的参数可以是字面值(literal value),也可以是表达式,它们会被自动解析。例如:

${printer.print()}
${myBean.addNewOrder('orderName')}
${myBean.doSomething(myVar, execution)}

myBean是Spring容器中的个Bean对象,表示调用的是bean的addNewOrder方法

(3).监听器分配

可以使用监听器来完成很多Flowable的流程业务。

我们在此处使用监听器来完成负责人的指定,那么我们在流程设计的时候就不需要指定assignee

创建自定义监听器:

/**
 * 自定义的监听器
 */
public class MyTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        System.out.println("监听器触发了:" + delegateTask.getName());
        if("提交请假流程".equals(delegateTask.getName()) &&
                "create".equals(delegateTask.getEventName())){
            // 指定任务的负责人
            delegateTask.setAssignee("小明");
        }else {
            delegateTask.setAssignee("小张");
        }
    }
}

然后在FlowableUI中关联对应的监听器

create:任务创建后触发
assignment:任务分配后触发
Delete:任务完成后触发
All:所有事件都触发

在这里插入图片描述
然后我们先部署流程,然后执行查看效果:
在这里插入图片描述
然后在Task表中我们可以看到对应的分配人为小明说明通过监听也完成了任务分配的工作了
在这里插入图片描述

2.流程变量

流程实例按步骤执行时,需要使用一些数据。在Flowable中,这些数据称作变量(variable),并会存储在数据库中。变量可以用在表达式中(例如在排他网关中用于选择正确的出口路径),也可以在Java服务任务(service task)中用于调用外部服务(例如为服务调用提供输入或结果存储),等等。

流程实例可以持有变量(称作流程变量 process variables);用户任务以及执行(executions)——流程当前活动节点的指针——也可以持有变量。流程实例可以持有任意数量的变量,每个变量存储为ACT_RU_VARIABLE数据库表的一行。

所有的startProcessInstanceXXX方法都有一个可选参数,用于在流程实例创建及启动时设置变量。例如,在RuntimeService中:

ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);

也可以在流程执行中加入变量。例如,(RuntimeService):

void setVariable(String executionId, String variableName, Object value);
void setVariableLocal(String executionId, String variableName, Object value);
void setVariables(String executionId, Map<String, ? extends Object> variables);
void setVariablesLocal(String executionId, Map<String, ? extends Object> variables);

在这里插入图片描述

(1).全局变量

流程变量的默认作用域是流程实例。当一个流程变量的作用域为流程实例时,可以称为 global 变量

注意:如: Global变量:userId(变量名)、zhangsan(变量值)

global 变量中变量名不允许重复,设置相同名称的变量,后设置的值会覆盖前设置的变量值。

(2).局部变量

任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大, 称为 local 变量。

Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响。Local 变量名也可以和 global 变量名相同,没有影响。

(3)案例讲解

需求:员工创建出差申请单,由部门经理审核,部门经理申请通过后3天以下由财务直接申批,3天以上先由总经理审批,总经理审批通过后再由财务审批。
在这里插入图片描述
连接先设置条件
在这里插入图片描述
部署流程

@Test
public void deploy(){
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    Deployment deploy = repositoryService.createDeployment()
        .addClasspathResource("出差申请单.bpmn20.xml")
        .name("请假流程...")
        .category("请假") // 分类
        .tenantId("dpb") // 租户id
        .deploy();
    System.out.println("deploy.getId() = " + deploy.getId());
    System.out.println("deploy.getName() = " + deploy.getName());
    System.out.println("deploy.getCategory() = " + deploy.getCategory());
}

启动流程实例:并且指定全局流程变量

/**
     * 在启动流程实例的时候设置流程变量
     */
    @Test
    public void runProcess(){
        // 获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 启动流程实例通过 RuntimeService 对象
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 设置流程变量
        Map<String,Object> variables = new HashMap<>();
        // 设置assignee的取值
        variables.put("assignee0","张三");
        variables.put("assignee1","李四");
        variables.put("assignee2","王五");
        variables.put("assignee3","赵财务");
        // 启动流程实例,第一个参数是流程定义的id
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceById("evection:1:4",variables);// 启动流程实例
        // 输出相关的流程实例信息
        System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例的ID:" + processInstance.getId());
        System.out.println("当前活动的ID:" + processInstance.getActivityId());

    }

完成Task任务,同时也可以指定流程变量

/**
     * 完成任务时指定流程变量
     */
    @Test
    public void completeTask(){

        // 获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                .processDefinitionId("evection:1:4")
                .taskAssignee("李四")
                .singleResult();
        // 添加流程变量
        Map<String, Object> map = task.getProcessVariables();
        map.put("num",4);

        // 完成任务
        taskService.complete(task.getId(),map);
    }

当然我们也可以在处理流程之外通过Task编号来修改流程变量

/**
     * 通过当前任务设置
     */
    @Test
    public void currentTask(){
        //   当前待办任务id
        //  获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                .processDefinitionId("evection:1:4")
                .taskAssignee("王五")
                .singleResult();
        // 添加流程变量
        Map<String, Object> map = task.getProcessVariables();
        map.put("num",1);
        //  一次设置多个值 设置局部变量
        taskService.setVariables(task.getId(), map);
    }

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

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

相关文章

基于云平台的光伏监控系统是怎样的?

摘要&#xff1a;针对国内光伏发电监控系统的研究现状&#xff0c;文中提出了基于云平台的光伏发电监控体系。构建基于B/S架构的数据实时采集与推送&#xff0c;以SSH(strutsspringhibernate)作为Web开发框架&#xff0c;开发基于云平台的光伏发电远程监控系统。在平台部署过程…

开关电源基础04:新型开关电源拓扑(2)-新型电源拓扑

说在开头&#xff1a;关于量子理论 我们再来回顾下量子理论对双缝干涉的解释&#xff1a;当电子通过狭缝&#xff0c;假如我们采用任其自然的观测方式&#xff0c;让它不受干扰地在空间中传播&#xff0c;这时候电子的波动性就占据了上风&#xff0c;它于是以某种方式同时穿过…

农业机器人技术栈

结构光 https://www.youtube.com/watch?vmSsnf5tqXnA 局部路径规划算法 光流法 统计像素 分辨前景背景 绿色是我们比较关注的 unet做图像分割 运动比较剧烈的是前景 特征点匹配 大豆农田点云建图 农田路况复杂 光流计算量比较大&#xff0c;可以捕捉运动比较大的物体 分割检…

ChatGPT直接访问,Edge浏览器-免费ChatGPT保姆级教程

人工智能大浪潮已经来临&#xff0c;对于ChatGPT&#xff0c;我觉得任何一个玩互联网的人&#xff0c;都应该重视起来&#xff0c;用起来。但是国内使用需要解决科学上网、注册、收费等繁琐问题。 所以&#xff0c;今天这篇文章就来推荐一个插件&#xff0c;无需任何繁琐操作&…

日撸 Java 三百行day48

文章目录 说明day48 堆排序1.基本思路2.代码 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/sampledata day48 堆排序 1.基本…

【虚幻引擎】UE5 C++编译和打包失败的原因

一、出现The required library hostfxr.dll could not be found 错误 原因是缺少.NET Core3.1 解决办法一&#xff1a;可以去官网下载https://dotnet.microsoft.com/en-us/download/dotnet/3.1 解决方案二&#xff1a;打开Visual Studio Installer&#xff0c;选择单个组件&…

计算机Intel CPU体系结构分析

前段meldown漏洞事件的影响&#xff0c;那段时间也正好在读Paul的论文关于内存屏障的知识&#xff0c;其中有诸多细节想不通&#xff0c;便陷入无尽的煎熬和冥想中&#xff0c;看了**《计算机系统结构》、《深入理解计算机系统》、《大话处理器》**等经典书籍&#xff0c;也在g…

ISO9001是什么?ISO9000和ISO9001有何关系?

ISO 9000和ISO 9001是质量管理领域的两个重要标准。它们被用来确保组织能够提供符合客户要求的产品和服务&#xff0c;同时不断提高其业务效率和质量水平。本文将探讨ISO 9000和ISO 9001之间的关系&#xff0c;解释它们的区别以及为什么对企业非常重要。 什么是ISO9000和ISO90…

Windows安装Maven并配置环境

Windows下安装和配置Maven的步骤 介绍&#xff1a;步骤&#xff1a;步骤 1&#xff1a;下载Maven步骤 2&#xff1a;解压缩Maven分发包步骤 3&#xff1a;设置环境变量步骤 4&#xff1a;验证安装 结论&#xff1a; 介绍&#xff1a; Maven是一个非常流行的构建和项目管理工具…

Tunel技术是什么?

IPv4 用 32 位整数描述地址&#xff0c;最多只能支持 43 亿设备&#xff0c;显然是不够用的&#xff0c;这也被称作 IP 地址耗尽问题。为了解决这个问题&#xff0c;有一种可行的方法是拆分子网。拆分子网&#xff0c;会带来很多问题&#xff0c;比如说内外网数据交互&#xff…

银行业数字化运营体系(上):渠道触点矩阵建设

数字化运营体系是构建从获客、激活、留存、营收转化到转介的客户全生命周期的运营体系&#xff0c;推动线上产品和业务运营的数字化与智能化。 随着互联网技术的不断发展&#xff0c;移动设备已经成为人们日常生活中不可或缺的一部分&#xff0c;越来越多的用户在数字化渠道进行…

vmware 详细安装教程

一.VM是什么&#xff1f; VMware Workstation是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。与“多启动”系统相比&#xff0c;VMWare 采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统&#xff0c;在系统切换时需…

软考A计划-重点考点-专题六(数据库知识)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

数据结构实验的实验报告--B树

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 数据结构实验的实验报告–B树 环境及工具 环境&#xff1a;C 工具&#xff1a;AnyivewCL B 定义 一棵 m 阶 B 树(Balance Tree of order m), 或为空树,或满足下列的特性的 m 叉树&#xff1a;(本次实验采用链式存储结构) …

SSM框架学习-加载properties文件

1. 创建新的命名空间 将 xmlns"http://www.springframework.org/schema/beans" 复制修改为 xmlns:context"http://www.springframework.org/schema/context" 再添加进去 表示开辟一个新的命名空间&#xff0c;叫做context 在xsi:schemaLocation中&#xff…

为什么耳鸣越来越年轻化了

耳鸣是一种声幻觉&#xff0c;当出现耳鸣的情况的时候&#xff0c;很多人都表示&#xff0c;耳朵总觉得听到很多奇怪的声音&#xff0c;甚至有时候还能听到车鸣笛声、或是轮船鸣笛声&#xff0c;但是附近并没有汽车轮船。 耳鸣&#xff0c;是一种没有外界声源情况下&#xff0c…

MapReduce框架原理

从源码的角度 :map --> sort —> copy --> sort -->reduce   sort —> copy --> sort属于shuffle InputFormat数据输入 切片与MapTask并行度决定机制 1&#xff09;问题引出 MapTask的并行度决定Map阶段的任务处理并发度&#xff0c;进而影响到整个Job的…

每日一个小技巧:1分钟告诉你视频转文字软件哪个好用

如果你曾经遇到过观看视频时无法边看边记笔记的尴尬&#xff0c;或是在听取讲座、会议录屏时错过关键词汇&#xff0c;那么这里有一个好的解决方法——使用视频转文字技术帮助你获取重要信息。通过这项技术&#xff0c;我们可以将视频中的内容转换成易于搜索和阅读的文字&#…

第一行代码 第八章 运用手机多媒体

第八章 运用手机多媒体 使用通知 通知&#xff08;Notification&#xff09;是Android系统中比较有特色的一个功能&#xff0c;当某个应用程序希望向用户发出一些提示信息&#xff0c;而该应用程序又不在前台运行时&#xff0c;就可以借助通知来实现。发出一条通知后&#xf…

2023年免费自动养站程序

什么是养站&#xff1f;SEO是与搜索引擎建立信任的过程&#xff0c;养站不仅仅是建立一个网站&#xff0c;还需要我们不断的更新和维护&#xff0c;才能使网站长时间稳定运行并获得更好的排名。今天跟大家分享如何建站以及如何养站。 一、明确TDK 在设计网站时&#xff0c;我…