flowable的Task使用

news2025/1/11 8:13:57

ReceiveTask
UserTask
ServiceTask
ScriptTask

ReceiveTask

执行到这个ReceiveTask会停下来,需要人工触发一下,才会继续执行

 ClassPathResource classPathResource = new ClassPathResource("processes/ReceiveTaskDemo.bpmn20.xml");
        String filename = classPathResource.getFilename();
        
        // 部署
        Deployment deploy = repositoryService.createDeployment()
                .name("deployment的name")
                .category("category")
                .key("key字段")
                .addInputStream(filename, classPathResource.getInputStream()).deploy();

开启流程定义:

    Authentication.setAuthenticatedUserId("ww");
        ProcessInstance receiveTaskDemo = runtimeService.startProcessInstanceByKey("ReceiveTaskDemo");

得到流程实例 ReceiveTask ,然后trigger

   // 得到这个 ReceiveTask
        List<Execution> list = runtimeService.createExecutionQuery().activityId("send_to_boss").list();

        for (Execution execution : list) {
            // 触发 ReceiveTask
            runtimeService.trigger(execution.getId());
        }

UserTask

设置单个用户

直接指定处理人: 硬编码,直接写死
必须要人处理的任务: 存在在act_ru_task表中

      // UserTask 存在  act_ru_task

                List<Task> list = taskService.createTaskQuery().taskAssignee("cc").list();
                for (Task task : list) {
                    //  处理掉   或者  交给别人处理
//                    taskService.complete(task.getId());

                    // 为某一个task 设置 处理人
                    taskService.setAssignee(task.getId(),"zs");

                }
            }

通过变量引用
在这里插入图片描述
在这里插入图片描述
启动流程实例的时候设置 ${manager} 变量的值

 HashMap<String, Object> map = new HashMap<>();
map.put("manager","ww");
// map传递变量进去
runtimeService.startProcessInstanceByKey("UserTaskDemo", map);

监听器设置
利用监听器,在任务创建的时候设置处理人
在这里插入图片描述

在这里插入图片描述
监听器设置 task 处理人
监听器实现 TaskListener接口:

package com.cj.listener;

import org.flowable.task.service.delegate.DelegateTask;
import org.flowable.task.service.delegate.TaskListener;

public class MyTaskListener implements TaskListener {

    // 任务被创建的时候,这个方法会被触发
    @Override
    public void notify(DelegateTask delegateTask) {
        // 相当于任务的代理
        // 设置任务处理人
        delegateTask.setAssignee("zl");
    }
}

设置为流程发起人
在这里插入图片描述
给UserTask设置处理人的时候,设置为变量,,变量的名称就是 发起人设置的变量 initiator
在这里插入图片描述
在流程启动的时候,指定流程发起人:

        // 指定发起人
        Authentication.setAuthenticatedUserId("cc");
//        identityService.setAuthenticatedUserId("cc");
        runtimeService.startProcessInstanceByKey("UserTaskDemo");

设置多个用户

指定候选人
在这里插入图片描述
当一个UserTask 有多个用户可以处理的时候,,在act_ru_task 的 assignee 字段为null,,
候选人在 act_ru_identitylink type为candidate。。。记录了任务由哪些人处理

        // 根据候选人查询任务   act_ru_identitylink
        List<Task> list = taskService.createTaskQuery().taskCandidateUser("cc").list();
        for (Task task : list) {
//            System.out.println(task.getIdentityLinks());
            System.out.println(task);
        }

根据流程的id 查询 流程参与者:

   // 根据流程实例  查找对应的  执行用户
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("7dac8e6f-97a2-11ed-a9c5-f0b61e94ce8e").singleResult();
        List<IdentityLink> list = runtimeService.getIdentityLinksForProcessInstance(processInstance.getId());
        for (IdentityLink identityLink : list) {
            System.out.println(identityLink.getUserId());
        }

act_ru_identitylink : 记录了 每个任务的 候选人,,,,和 每一个流程 的 参与人

认领任务:
已经被认领的任务,,不能再次被认领,,如果你认领了之后又不想去处理,可以使用委派的方式,交给其他人处理

     // 根据候选人查询任务   act_ru_identitylink
        List<Task> list = taskService.createTaskQuery().taskCandidateUser("cc").list();
        for (Task task : list) {
            // 查到任务还需要认领任务,,, 认领的本质就是 act_ru_task 的 assignee 设置值
            // 认领任务
            taskService.claim(task.getId(),"ls");
        }
 // 委派给其他人
 taskService.setAssignee(task.getId(),"ls");
 // 完成任务
 taskService.complete(task.getId());

使用变量或者监听器处理
在这里插入图片描述

    HashMap<String, Object> map = new HashMap<>();
    map.put("userIds","cc,zs,ww");
    runtimeService.startProcessInstanceByKey("UserTaskDemo", map);
public class MyTaskListener implements TaskListener {

    // 任务被创建的时候,这个方法会被触发
    @Override
    public void notify(DelegateTask delegateTask) {
        // 相当于任务的代理
        // 设置任务处理人
//        delegateTask.setAssignee("zl");
        
        // 监听器设置委托人
        delegateTask.addCandidateUser("zs");
        delegateTask.addCandidateUser("ww");
    }
}

任务回退:
已经认领的任务回退,,,让其他人可以认领

   List<Task> list = taskService.createTaskQuery().taskAssignee("ww").list();
    for (Task task : list) {
        // 回退任务   就是将 assignee 设置为 null
        taskService.setAssignee(task.getId(),null);
        // 认领任务
        taskService.claim(task.getId(),"zs");
    }

添加删除候选人:

  List<Task> list = taskService.createTaskQuery().list();
    for (Task task : list) {
        // 添加候选人  act_ru_identitylink
        taskService.addCandidateUser(task.getId(),"ls");
        // 删除候选人
        taskService.deleteCandidateUser(task.getId(),"ww");
    }

设置执行组:
在这里插入图片描述
在这里插入图片描述
在根据用户id查找task的时候,会去 act_id_group找到你的组,,然后去act_ru_identitylink找taskId,找act_ru_task

        List<Task> list = taskService.createTaskQuery().taskCandidateUser("ww").list();
        for (Task task : list) {
            System.out.println(task.getName());
        }

        List<Task> list1 = taskService.createTaskQuery().taskCandidateGroup("manager").list();
        for (Task task : list1) {
            System.out.println(task.getName());
            // 先认领,后执行
            taskService.claim(task.getId(),"ww");
            taskService.complete(task.getId());
        }

候选组通过变量来指定:
xml中指定候选组是变量,,在启动实例的时候,将变量的值设置进去,,那么默认的group就是你设置的值

ServiceTask

服务任务,由系统自动完成的任务

首先定义一个 ServiceTask的监听器类,,,实现JavaDelagate接口,,绘制流程图的时候,配置这个监听器类,,,这个监听器类是自动完成的任务
在这里插入图片描述
在这里插入图片描述

package com.cj.serviceTask;

import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.JavaDelegate;
// 自定义监听器类 ,,,ServiceTask执行到这里的时候,会自动执行该类中的 execute()
public class MyServiceTask01 implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("======================");
    }
}

ServiceTask 不会操作 act_ru_task

为类设置字段:
在这里插入图片描述

在这里插入图片描述
获取字段值:

package com.cj.serviceTask;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.JavaDelegate;
// 自定义监听器类 ,,,ServiceTask执行到这里的时候,会自动执行该类中的 execute()
public class MyServiceTask01 implements JavaDelegate {


    Expression username;
    @Override
    public void execute(DelegateExecution execution) {
        // 获取username的值
        System.out.println("username.getExpressionText() = " + username.getExpressionText());
        System.out.println("username.getValue(execution) = " + username.getValue(execution));
        System.out.println("======================");
    }
}

设置委托表达式

委托表达式类似于监听器类,但是这种表达式,,可以将类注册到spring容器中,,在流程图中可以直接配置 bean的名称

在这里插入图片描述
在这里插入图片描述
配置的这个bean,,就是实现了JavaDelegate的类实例

表达式
前面两种,都离不开 JavaDelegate接口,,如果就是一个普通的bean,,其实也可以配置成 ServiceTask的执行类。。。

配置表达式: 委托表达式配置的bean必须实现JavaDelegate接口
在这里插入图片描述

@Component
public class MyServiceTask02 {
    public void hello(){
        System.out.println("=============hello=============");
    }
}

在这里插入图片描述
表达式不能传递 字段,,,传递字段只能在 JavaDelegate中使用

ScriptTask

脚本任务和 ServiceTask 都是自动执行的,,不同的是,脚本任务的逻辑是通过一些非 java 的脚本语言来实现的

JavaScript

在这里插入图片描述

在这里插入图片描述

  @Test
    public void test02(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("a",99);
        map.put("b",1);
        runtimeService.startProcessInstanceByKey("ScriptTaskDemo", map);
    }

在这里插入图片描述

Groovy

基于 jvm 的编程语言,,需要 jvm 来跑,,

Juel

juel : java unified expression language 主要在jsp中使用

在这里插入图片描述

在这里插入图片描述
去执行 bean名字中的 hello() 方法

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

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

相关文章

C++——模板与STL标准模板库

目录 一、模板 1.1类型模板 1.2非类型模板 二、STL 2.1链表实现 2.2迭代器 2.3STL容器 2.4STL算法 三、模板特化的匹配规则 (1) 类模板的匹配规则 (2) 函数模板的匹配规则 一、模板 1.1类型模板 #include <stdio.h> #include <iostream>using namespac…

深度学习 GAN生成对抗网络-手写数字生成及改良

如果你有一定神经网络的知识基础&#xff0c;想学习GAN生成对抗网络&#xff0c;可以按顺序参考系列文章&#xff1a; 深度学习 自动编码器与生成模型 深度学习 GAN生成对抗网络-1010格式数据生成简单案例 深度学习 GAN生成对抗网络-手写数字生成 一、前言 在前面一篇文章&am…

877. 石子游戏

877. 石子游戏题目算法设计&#xff1a;奇偶算法设计&#xff1a;动态规划题目 算法设计&#xff1a;奇偶 最简单的情况&#xff0c;只有2堆石子&#xff08;石子奇数&#xff09;&#xff0c;先稳赢。 但是四堆情况不同了&#xff0c;如 [3 7 2 3]。 不能直接选最大的&…

2023年五大趋势预测 | 大数据分析、人工智能和云产业展望

随着我们迈入2023年&#xff0c;大数据分析、人工智能和云产业将迎来蓬勃的创新和发展阶段 以下是我们预测的&#xff0c;将对行业格局产生重大影响的五大趋势&#xff1a; 世界在剧变&#xff0c;我们需要尽快寻找行业中的方向&#xff0c;迅速重回轨道 2023年&#xff0c;全…

TryHackMe-NahamStore(常见web漏洞 大杂烩)

NahamStore 漏洞赏金web安全 NahamStore的创建是为了测试您在NahamSec的“漏洞赏金狩猎和Web应用程序黑客入门”Udemy课程中学到的知识。 部署计算机&#xff0c;获得 IP 地址后&#xff0c;进入下一步&#xff01; 写在前面 可能我的顺序&#xff0c;跟别人以及题目都不太一…

spring boot集成activemq(windows)

目录 1.环境配置 2.说明 3.服务启动 4.示例 导入依赖 配置文件 service层 配置类 监听器 5.总结 1.环境配置 下载地址&#xff1a;https://activemq.apache.org/components/classic/download/安装&#xff1a;解压缩即可注意每个版本对应的java版本不一样&#xff0c…

分享96个PHP源码,总有一款适合您

PHP源码 分享96个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 96个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1B-tNZlbfjT_D3n_Y6ZwfDw?pwduq19 提取码&#xff…

共享自助自习室棋p室茶室办公室电竞篮球馆小程序开发

共享自助自习室棋p室茶室办公室电竞篮球馆小程序开发 多场景应用的共享空间预约系统如:棋牌室;共享办公室&#xff0c;电竞篮球馆&#xff0c;自助民宿等。目前该应用已对接门锁和电控。 前端功能// 多场景应用、预约时间自定义、附近门店一目了然、支持门禁支持电控、首页门…

Windows系统安装轻量级高性能Web服务开发框架OAT++

一、软件简介 oat 是一个轻量级高性能 Web 服务开发框架&#xff0c;采用纯 C 编写而成。官网&#xff1a;https://oatpp.io/ 这个坑爹的网址在国内经常打不开&#xff0c;要多刷新几次。Github: https://github.com/oatpp/oatpp 当前版本&#xff1a; 1.3.0 其主要特性…

用PYTHON自动登录SAP GUI

我们都知道&#xff0c;SAP原生的“脚本录制和回放”功能是在用户进入到某一个SAP”用户指定系统“后才可以启用&#xff1a; 也就是说&#xff0c;从这里开始&#xff0c;您可以通过脚本录制&#xff0c;生成用户名、密码的输入和SAP登录过程的完整代码&#xff1b; 那么我们…

第三层:C++对象模型和this指针

文章目录前情回顾C对象模型和this指针类成员变量和类成员函数的储存this指针this指针概念this指针用途用途1解释用途2解释空指针调用成员函数const修饰的成员变量常函数内可以被修改的值突破&#xff01;步入第四层本章知识点&#xff08;图片形式&#xff09;&#x1f389;wel…

Matlab中算法结合Simulink求解直流微电网中功率

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

初识 jQuery(JavaScript 框架)

初识 jQuery&#xff08;JavaScript 框架&#xff09;参考描述jQuery使用 jQuery 的开发优势&#xff08;部分&#xff09;获取jQuery 语法基础语法入口函数$()jQuery 与 $参数DOM 与 jQuery模板获取DOM 对象jQuery 对象转换DOM 对象转换为 jQuery 对象$()jQuery 对象转换为 DO…

Linux系统管理中Nginx和python的安装以及python虚拟环境软件的安装与使用(四)

1、Nginx的安装和配置&#xff1a; 说明&#xff1a;Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器&#xff1b;同时也是一个IMAP、POP3、SMTP代理服务器&#xff1b;Nginx可以作为一个HTTP服务器进行网站的发布处理&#xff0c;另外Nginx可以作为反向代理进…

C++:list结构算法

List 1.元素在逻辑上具有线性次序&#xff0c;物理地址不做限制。 2.哨兵节点&#xff0c;header和trailer&#xff0c;封装后外部不可见。 3.重载操作符[]&#xff0c;实现下标和位置转换。 4.有序查找无序查找 5.前插入算法&#xff0c;首先创建新节点 然后使new成为this节点…

设计模式之代理模式(静态动态)代理

前言&#xff1a;二十三种设计模式中的一种&#xff0c;属于结构型模式。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥…

PHP设计模式

目录 一、使用设计模式目的 二、设计模式的七大原则 三、创建型模式&#xff08;构建型模式&#xff09; 1、单例模式 代码实例 2、工厂模式 2.1、工厂模式——简单工厂模式 简单工厂模式的代码实例 2.2、工厂模式——工厂方法模式 工厂方法模式的代码实例 2.3、工厂…

java开发环境配置及问题排查

Java程序必须运行在JVM之上&#xff0c;所以&#xff0c;我们第一件事情就是安装JDK。 JDK(Java Development Kit)&#xff0c;是Java开发工具包&#xff0c;它提供了Java的开发环境(提供了编译器javac等工具&#xff0c;用于将java文件编译为class文件)和运行环境(提 供了JVM…

Java内存模型和线程安全

Java内存模型和线程安全Java内存模型引言volatile关键字synchronized关键字Java线程Java线程安全synchronized锁优化锁优化技巧列举自旋锁锁消除锁粗化具体实现轻量级锁偏向锁Java内存模型 引言 对于多核处理器而言,每个核都会有自己单独的高速缓存,又因为这多个处理器共享同一…

JavaWeb-会话技术

JavaWeb-会话技术 1&#xff0c;会话跟踪技术的概述 对于会话跟踪这四个词&#xff0c;我们需要拆开来进行解释&#xff0c;首先要理解什么是会话&#xff0c;然后再去理解什么是会话跟踪: 会话:用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff…