flowable的Task使用

news/2023/6/7 0:02:50

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

   // 得到这个 ReceiveTaskList<Execution> list = runtimeService.createExecutionQuery().activityId("send_to_boss").list();for (Execution execution : list) {// 触发 ReceiveTaskruntimeService.trigger(execution.getId());}

UserTask

设置单个用户

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

      // UserTask 存在  act_ru_taskList<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 {// 任务被创建的时候,这个方法会被触发@Overridepublic 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_identitylinkList<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_identitylinkList<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 {// 任务被创建的时候,这个方法会被触发@Overridepublic 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 设置为 nulltaskService.setAssignee(task.getId(),null);// 认领任务taskService.claim(task.getId(),"zs");}

添加删除候选人:

  List<Task> list = taskService.createTaskQuery().list();for (Task task : list) {// 添加候选人  act_ru_identitylinktaskService.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 {@Overridepublic 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;@Overridepublic 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

在这里插入图片描述

在这里插入图片描述

  @Testpublic 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.exyb.cn/news/show-4566872.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能辅助药物发现(2)苗头化合物筛选

目录AI辅助苗头化合物筛选概述AI辅助CPICPI数据库蛋白质和化合物的特征表示深度学习CPI预测经典Y型架构基于注意力的架构基于复合物的架构CPI性能评估苗头化合物筛选的发展前景挑战与趋势实际应用AI辅助苗头化合物筛选概述 新型小分子药物的开发通常从生物学家确定疾病靶标开始…

comsol仿真模型:风力发电机复合材料叶片的应力和模态分析

风力发电机是越来越受欢迎的可再生资源。因此&#xff0c;风力发电机的设计、分析和制造对能源工业具有重要意义。发电机叶片是风力发电机的关键部件。当发电机旋转发电时&#xff0c;叶片必须承受不同类型的载荷&#xff0c;如风力载荷、重力载荷和离心载荷。叶片体积庞大&…

风机桨叶故障诊断(三) 识别桨叶——初步构建BP神经网络

风机桨叶故障诊断&#xff08;三&#xff09; 识别桨叶——初步构建BP神经网络 新的一天&#xff0c;希望有好的运气。今天开始着手系统的第一个模块&#xff0c;从一幅图像中寻找到桨叶所在的位置。第一直觉我们的识别任务属于难度比较大&#xff0c;干扰因素多的了&#xff…

基于 HTML5 WebGL 的 3D 风机 Web 组态工业互联网应用

前言 在目前大数据时代背景之下&#xff0c;数据可视化的需求也变得越来越庞大,在数据可视化的背景之下&#xff0c;通过智能机器间的链接并最终将人机链接,结合软件和大数据分析的工业互联网也将变得越来越容易实现! 国家也敏锐意识到时代特性并及时把握时机&#xff0c;培育…

基于xgboost的风力发电机叶片结冰分类预测

xgboost中文叫做极致梯度提升模型&#xff0c;官方文档链接&#xff1a;https://xgboost.readthedocs.io/en/latest/tutorials/model.html 2018年9月6日笔记 IDE(Intergrated development Environment)&#xff0c;集成开发环境为jupyter notebook 操作系统&#xff1a;Win10 语…

为什么STM32设置Flash地址0x08000000而不是0x00000000?STM32的启动过程

STM32F103ZE芯片存储空间的地址映射关系图。 在MDK编译程序设置ROM和RAM地址时候发现&#xff1a;    IROM1为片上程序存储器&#xff0c;即片上集成的Flash存储器&#xff0c;对该处理器Flash大小为512KB&#xff0c;即0x80000 地址区间为0x8000000~0x0807FFFF  IRAM1为片…

股票中MACD如何计算,有什么意义

MACD称为指数平滑移动平均线&#xff0c;是从双指数移动平均线发展而来的&#xff0c;由快的指数移动平均线&#xff08;EMA12&#xff09;减去慢的指数移动平均线&#xff08;EMA26&#xff09;得到快线DIF&#xff0c;再用2&#xff08;快线DIF-DIF的9日加权移动均线DEA&…

一个使用laravel创建word的实例

这是一个从零开始使用laravel例子.一个很简单的功能&#xff0c;在页面上上传指标值(json格式),然后点按纽会把指标按一定格式输出word.其中使用了laravel的一些基本的功能。 1)首先创建项目CreateWord 命令行输入&#xff1a;laravel new CreateWord 这时会自动创建一个目录Cr…