28. flowable 任务多实例

本文详细介绍了Flowable工作流引擎中多实例任务的使用方法,包括内置变量介绍、配置参数、候选人和结束条件的设定。并通过具体代码示例展示了如何设置多实例任务的人员列表,为读者提供了深入理解及实践的指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目地址:https://gitee.com/lwj/flowable.git 分支flowable-base
视频地址:https://www.bilibili.com/video/av79774697/
*业务场景:
收集每个员工的绩效考核信息;
收集一次组织活动的信息;
一个合同需要三个经理审批,可以是顺序的也可以是并行的;
一个合同计划审批有30个人审批,只需要其中70%的人审批通过即可。等等 *

1、任务多实例四个内置变量
属性解释
nrOfInstances一共有多少个实例
nrOfCompletedInstances已经完成的实例个数
nrOfActiveInstances未完成的实例个数
2、配置多实例

2.1、配置参数
在这里插入图片描述
2.2、配置候选人
在这里插入图片描述
2.3、配置结束条件
在这里插入图片描述

3、启动设置userList
public ReturnVo add(Leave leave, String sessionId) {
        ReturnVo returnVo = new ReturnVo(ReturnCode.FAIL, "添加失败");
        try {
            String leaveId = UUIDGenerator.generate();
            leave.setId(leaveId);
            StartProcessInstanceVo startProcessInstanceVo = new StartProcessInstanceVo();
            startProcessInstanceVo.setBusinessKey(leaveId);
            User user = SecurityUtils.getCurrentUserObject();
            startProcessInstanceVo.setCreator(user.getId());
            startProcessInstanceVo.setCurrentUserCode(user.getId());
            startProcessInstanceVo.setFormName("请假流程");
            startProcessInstanceVo.setSystemSn("flow");
            startProcessInstanceVo.setProcessDefinitionKey("leave");
            Map<String, Object> variables = new HashMap<>();
            variables.put("days", leave.getDays());
            startProcessInstanceVo.setVariables(variables);
            //设置三个人作为多实例的人员
            List<String> userList = new ArrayList<>();
            userList.add("00000005");
            userList.add("00000006");
            variables.put("userList", userList);

            ReturnVo<ProcessInstance> returnStart = flowableProcessInstanceService.startProcessInstanceByKey(startProcessInstanceVo);
            if (returnStart.getCode().equals(ReturnCode.SUCCESS)){
                String processInstanceId = returnStart.getData().getProcessInstanceId();
                leave.setProcessInstanceId(processInstanceId);
                this.LeaveService.insertLeave(leave);
                returnVo = new ReturnVo(ReturnCode.SUCCESS, "添加成功");
            }else {
                returnVo = new ReturnVo(returnStart.getCode(), returnStart.getMsg());
            }
        } catch (Exception e) {
            logger.error("LeaveController-add:", e);
            e.printStackTrace();
        }
        return returnVo;
    }
### io.reactivex.Flowable 的用法及详细说明 `Flowable` 是 RxJava 2 中的一个核心类,用于支持背压 (Backpressure) 的场景。它是一个可以发射零个或多个数据项的可观察序列,并且能够处理背压问题。以下是关于 `Flowable` 的详细介绍和使用示例。 #### Flowable 的基本概念 `Flowable` 提供了完整的反应式流规范的支持,这意味着它可以处理背压情况下的数据传输[^1]。当消费者无法跟上生产者的速度时,背压机制允许两者之间协调工作,防止内存溢出等问题的发生。 #### 创建 Flowable 实例的方式 可以通过多种方式创建 `Flowable` 对象: - **fromArray**: 将数组转换为 `Flowable` 序列。 - **just**: 发射固定数量的数据项。 - **range**: 发射指定范围内的整数。 - **create**: 手动控制数据的发射过程。 下面是一些常见的例子来展示如何创建并操作 `Flowable`。 ```java import io.reactivex.rxjava3.core.*; import java.util.concurrent.TimeUnit; public class FlowableExample { public static void main(String[] args) throws InterruptedException { // 使用 just 方法创建 Flowable 并订阅 Flowable.just(1, 2, 3) .subscribe(System.out::println); System.out.println("---"); // 使用 fromArray 方法从数组创建 Flowable Integer[] numbers = {4, 5, 6}; Flowable.fromArray(numbers) .subscribe(System.out::println); System.out.println("---"); // 使用 range 方法生成一系列连续整数 Flowable.range(10, 5) .subscribe(System.out::println); System.out.println("---"); // 背压演示:onBackpressureDrop() Flowable.interval(100, TimeUnit.MILLISECONDS) .take(10) .onBackpressureDrop() // 如果下游消费慢,则丢弃上游产生的多余数据 .observeOn(Schedulers.computation()) // 切换到 computation 线程池 [^2] .subscribe(i -> { try { Thread.sleep(300); // 模拟缓慢的消费者 } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("Received: " + i); }); Thread.sleep(5000); // 防止主线程过早退出 } } ``` 上述代码展示了几个重要的功能: 1. 如何利用不同的静态方法 (`just`, `fromArray`, `range`) 来构建 `Flowable` 流; 2. 展现了一个简单的背压策略应用实例 —— `onBackpressureDrop()`,该策略会简单地丢弃那些来不及被处理的数据项; 3. 结合线程切换技术(如 `observeOn` 和 `Schedulers.computation()`),使得异步任务能够在合适的线程环境中执行。 #### 处理背压的不同策略 除了 `onBackpressureDrop()`,还有其他几种常用的背压处理策略可供选择: - **buffer**: 缓存所有的未处理项目直到有空间为止。 - **latest**: 只保留最新的一个未处理项目而忽略其余旧项目的请求。 - **error**: 当发生背压的时候抛出异常终止流程。 每种策略适用于不同的情境下解决特定类型的性能瓶颈或者资源限制问题。 --- ### 总结 `Flowable` 是 RxJava 中非常强大的工具之一,尤其适合于需要考虑背压管理的应用场合。通过灵活运用其丰富的 API 接口以及合理的配置相应的背压解决方案,开发者可以在复杂的并发环境下更加高效稳定地完成各项任务需求。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生05101

flowable

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值