flowable系列之流程变量(代码片段)

波波烤鸭 波波烤鸭     2022-12-02     250

关键词:

流程变量

  流程实例按步骤执行时,需要使用一些数据。在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);
    

搞定~

mysql之流程函数(代码片段)

  备战2022春招或暑期实习,本专栏会持续输出MySQL系列文章,祝大家每天进步亿点点!文末私信作者,我们一起去大厂。本篇总结的是《MySQL之流程函数》,后续会每日更新~关于《Redis入门到精通》、《并发... 查看详情

python之流程控制(代码片段)

Python之流程控制if语句条件判断语句ifa==b:pass#满足条件再执行ifa==b:passelse:pass#满足条件执行第一种语句,不满足条件则执行第二种语句ifa==b:#条件1pass#语句1elifa>b:#条件2pass#语句2else:pass#语句3如果满足条件1,则执行语句1,语句2... 查看详情

java基础之流程语句(代码片段)

JAVA流程语句有几下几种:一、if语句:1.if语句:如果满足条件语句,则执行执行语句;   if(条件语句)    执行语句;     ....;   2.if....else语句:如果满足判断语句,则执行执行语句1,否则执行执行语句2;... 查看详情

flowable入门系列文章12-flowableapi02(代码片段)

...个流程实例都需要并使用数据来执行它所组成的步骤。在Flowable中,这个数据被称为变量,它们被存储在数据库中。在调用外部服务(例如提供输入或存储服务调用的结果)时,变量可用于表达式中(例如&... 查看详情

activiti之流程变量

所谓的流程变量,大概也就是和咱们业务相关的数据,例如我要请假,那我得知道是谁在请假请假人是谁,也就是我要知道activiti的实体和咱们业务的javaBean如何关联起来。      下边我们先看一下和流程变... 查看详情

go语言基础之流程控制(代码片段)

流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制... 查看详情

细说webpack之流程篇(代码片段)

引言目前,几乎所有业务的开发构建都会用到webpack。的确,作为模块加载和打包神器,只需配置几个文件,加载各种loader就可以享受无痛流程化开发。但对于webpack这样一个复杂度较高的插件集合,它的整体流... 查看详情

flowable入门系列文章56-多实例(代码片段)

1、描述多实例活动是定义用于业务流程的某些步骤的重复的方法。在编程概念中,多实例相当于每个构造:它允许您为给定集合中的每个项目按顺序或并行地执行某个步骤,甚至完成一个子流程。多实例是具有定义&#... 查看详情

flowable:processengine系列(代码片段)

Flowable-ProcessEngineFlowable-ProcessEngine流程引擎系列(2)一、构建原理1、ProcessEngineConfiguration构建ProcessEngine2、ProcessEngines构建ProcessEngine3、总结Flowable-ProcessEngine流程引擎系列(2)     查看详情

flowable:processengine系列(代码片段)

Flowable-ProcessEngineFlowable-ProcessEngine流程引擎系列(2)一、构建原理1、ProcessEngineConfiguration构建ProcessEngine2、ProcessEngines构建ProcessEngine3、总结Flowable-ProcessEngine流程引擎系列(2)     查看详情

mysql之流程函数(代码片段)

  备战2022春招或暑期实习,本专栏会持续输出MySQL系列文章,祝大家每天进步亿点点!文末私信作者,我们一起去大厂。本篇总结的是《MySQL之流程函数》,后续会每日更新~关于《Redis入门到精通》、《并发... 查看详情

mysql之流程函数(代码片段)

  备战2022春招或暑期实习,本专栏会持续输出MySQL系列文章,祝大家每天进步亿点点!文末私信作者,我们一起去大厂。本篇总结的是《MySQL之流程函数》,后续会每日更新~关于《Redis入门到精通》、《并发... 查看详情

flowable入门系列文章68-表单属性(代码片段)

...含在流程变量本身中,或者通过流程变量进行引用。Flowable支持将复杂的Java对象存储为流程变量,如Serializable对象,JPA实体或整个XML文档String。启动流程和完成用户任务是人们参与流程的地方。与人交流需要在某些UI... 查看详情

java学习之流程控制语句(选择结构)

 流程控制语句1选择结构ifif语句有三种语法格式,每一种格式都有它自身的特点。1.1if语句if语句是指如果满足某种条件,就进行某种处理。在Java中,if语句的具体语法格式如下:if(条件语句){   执行语句;  ... 查看详情

flowable入门系列文章4-流程实例(代码片段)

1、启动一个流程实例我们现在将流程定义部署到流程引擎,因此可以使用此流程定义作为蓝图来启动流程实例。要启动流程实例,我们需要提供一些初始流程变量。通常情况下,当某个进程被自动触发时,您将通... 查看详情

javascript基础之流程控制语句

第三部分:流程控制语句JavaScript代码是书写位置:JavaScript代码应该写在<scripttype=”text/javascript”></script>这一对标记中。或者作为外部引用<scriptsrc="JavaScript代码路径"></script>JavaScript的每一句代码请用分号作为... 查看详情

flowable入门系列文章23-基本的flowable概念四(代码片段)

...面文章中的介绍整理的代码。代码考虑到您可能已经通过Flowable应用程序UI启动了一些流程实例。它检索一个任务列表,而不是一个任务,所以它始终工作:publicclassTenMinuteTutorialpublicstaticvoidmain(String[]args)//CreateFlowablepr... 查看详情

flowable:processengine系列(代码片段)

Flowable-ProcessEngineFlowable-ProcessEngine流程引擎系列(1)一、构建ProcessEngine常规方法:参数填充快速创建:默认规范快速创建:依赖注入(XML方式)二、ProcessEngine核心内容三、ProcessEngine配置解读四、总结F... 查看详情