08.flowable 流程实例的启动

本文详细介绍了使用Flowable流程引擎启动流程实例的过程,包括代码演示和关键步骤解析,如设置变量、启动流程及添加审批记录。

项目地址:https://gitee.com/lwj/flowable.git 分支flowable-base
视频讲解地址
https://space.bilibili.com/485524575/channel/detail?cid=94579

1、演示

在这里插入图片描述

2、代码

public ReturnVo<ProcessInstance> startProcessInstanceByKey(StartProcessInstanceVo params) {
        ReturnVo<ProcessInstance> returnVo = new ReturnVo<>(ReturnCode.SUCCESS, "启动成功");
        if (StringUtils.isNotBlank(params.getProcessDefinitionKey())
                && StringUtils.isNotBlank(params.getBusinessKey())
                && StringUtils.isNotBlank(params.getSystemSn())) {
            ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey(params.getProcessDefinitionKey())
                    .latestVersion().singleResult();
            if (processDefinition != null && processDefinition.isSuspended()) {
                returnVo = new ReturnVo<>(ReturnCode.FAIL, "此流程已经挂起,请联系系统管理员!");
                return returnVo;
            }
            /**
             * 1、设置变量
             * 1.1、设置提交人字段为空字符串让其自动跳过
             * 1.2、设置可以自动跳过
             * 1.3、汇报线的参数设置
             */
            //1.1、设置提交人字段为空字符串让其自动跳过
            params.getVariables().put(FlowConstant.FLOW_SUBMITTER_VAR, "");
            //1.2、设置可以自动跳过
            params.getVariables().put(FlowConstant.FLOWABLE_SKIP_EXPRESSION_ENABLED, true);
            // TODO 1.3、汇报线的参数设置
            //2、当我们流程创建人和发起人
            String creator = params.getCreator();
            if (StringUtils.isBlank(creator)) {
                creator = params.getCurrentUserCode();
                params.setCreator(creator);
            }
            //3.启动流程
            identityService.setAuthenticatedUserId(creator);
            ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder()
                    .processDefinitionKey(params.getProcessDefinitionKey().trim())
                    .name(params.getFormName().trim())
                    .businessKey(params.getBusinessKey().trim())
                    .variables(params.getVariables())
                    .tenantId(params.getSystemSn().trim())
                    .start();
            returnVo.setData(processInstance);
            //4.添加审批记录
            this.addComment(params.getCurrentUserCode(), processInstance.getProcessInstanceId(),
                    CommentTypeEnum.TJ.toString(), params.getFormName() + "提交");
            //5.TODO 推送消息数据
        } else {
            returnVo = new ReturnVo<>(ReturnCode.FAIL, "请填写 这三个字段 ProcessDefinitionKey,BusinessKey,SystemSn");
        }
        return returnVo;
    }
<think> 嗯,用户的问题是关于Flowable流程实例写入变量的方法和示例。我需要根据提供的引用内容来回答这个问题。 先看看引用内容中的关键信息:引用[1]介绍了流程变量的基本概念,说明变量存储在数据库中,用于流程执行时的数据传递;引用[2]提到这篇文章是讨论流程实例的相关内容;引用[3]则直接给出了一个Java代码示例,展示如何使用runtimeService.setVariable()方法设置流程变量。 用户明确询问的是写入变量的方法和示例,所以重点应该放在引用[3]提供的代码示例上。这个示例很清晰:通过runtimeService的setVariable方法,传入流程实例ID、变量名和变量值三个参数即可设置流程变量。 考虑到用户可能需要更全面的指导,我还可以补充说明:在Flowable中设置变量除了setVariable还有setVariableLocal等方法,但用户当前问题聚焦在流程实例级别的变量写入,所以核心方法就是setVariable。 为了回答更有帮助,应该提供完整的代码示例和分步说明,包括:获取RuntimeService的方式、方法参数说明、变量作用范围等。同时要提醒注意事项,比如流程实例ID必须有效、变量需要可序列化等。 最后可以延伸一些相关知识,比如变量类型支持、其他设置方法等,让用户有进一步探索的空间。不过核心回答要聚焦在用户询问的"写入方法和示例"上,避免偏离主题。 在结构上,考虑先解释方法原理再给示例代码,最后补充说明注意事项和扩展方法。这样用户既能立即解决问题,又能获得深入学习的路径。相关问题的设计也要围绕变量操作展开,比如如何读取变量、变量作用域等常见后续问题。 </think> 在 Flowable 中,向**流程实例**写入变量主要通过 `RuntimeService` 的 `setVariable` 方法实现。以下是具体方法和示例: --- ### **写入流程实例变量的核心方法** 1. **`setVariable(String executionId, String variableName, Object value)`** - **作用**:为指定的流程实例或执行流设置一个**全局变量**(在整个流程实例内可见)。 - **参数**: - `executionId`:流程实例 ID 或执行流 ID(通常用流程实例 ID)。 - `variableName`:变量名(字符串)。 - `value`:变量值(支持基本类型、`Serializable` 对象、集合等)。 2. **`setVariableLocal(String executionId, String variableName, Object value)`** - **作用**:设置**局部变量**(仅在当前执行流或任务中可见)[^3]。 --- ### **代码示例** ```java import org.flowable.engine.RuntimeService; import org.flowable.engine.RuntimeService; // 关键服务接口 public class FlowableVariableService { private final RuntimeService runtimeService; // 注入RuntimeService // 为流程实例设置全局变量 public void setProcessInstanceVariable(String processInstanceId, String key, Object value) { runtimeService.setVariable(processInstanceId, key, value); } // 示例调用 public void demo() { String processInstanceId = "12345"; // 实际流程实例ID setProcessInstanceVariable(processInstanceId, "orderAmount", 10000.0); // 写入数值型变量 setProcessInstanceVariable(processInstanceId, "approvalStatus", "PENDING"); // 写入字符串变量 } } ``` --- ### **关键说明** 1. **变量作用域**: - **`setVariable`**:变量在整个流程实例中共享(例如在网关条件、服务任务中均可访问)。 - **`setVariableLocal`**:变量仅绑定到当前执行流(如特定用户任务)[^1][^3]。 2. **变量类型**:支持 `String`, `Integer`, `Date`, `Map`, 自定义序列化对象等。 3. **写入时机**:可在流程启动时、任务完成时或通过监听器动态写入。 --- ### **其他写入方式** 1. **启动流程时写入**: ```java Map<String, Object> variables = new HashMap<>(); variables.put("initiator", "user1"); ProcessInstance instance = runtimeService.startProcessInstanceByKey("orderProcess", variables); ``` 2. **通过任务写入**: ```java taskService.setVariable(taskId, "key", value); // 全局变量 taskService.setVariableLocal(taskId, "key", value); // 局部变量 ``` --- ### **注意事项** - **流程实例ID**:必须有效且正在运行(可通过 `runtimeService.createProcessInstanceQuery()` 查询)。 - **事务性**:变量操作默认在事务中提交到数据库[^1]。 - **序列化**:自定义对象需实现 `Serializable` 接口。 --- **相关问题**: 1. Flowable 中如何读取流程实例的变量? 2. 流程变量的作用域(全局 vs 局部)在实际业务中如何选择? 3. Flowable 支持哪些类型的流程变量?存储有何限制? 4. 如何在流程定义文件(BPMN)中预设默认变量? [^1]: 流程变量存储在数据库中,用于表达式、网关决策和服务任务。 [^3]: 使用 `runtimeService.setVariable()` 写入全局流程变量
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小学生05101

flowable

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

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

打赏作者

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

抵扣说明:

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

余额充值