flowable-startEvent[开始事件]相关配置[表单、执行监听器]

flowable各个事件、网关、任务的使用详解

既然网上没有合适的教程,那就力求达到先会用,再理解。

当然各个事件有一些功能是重复的,比如事件和任务都有执行监听器,这个等说到任务的时候就会提一下,然后带过。

今天只看“开始事件”的相关配置

这是若依框架和flowableui官方文档针对“开始事件”做的一个对比截图,还是能一目了然的看清楚两个前端框架实际实现的功能都是差不多的:比如都有ID、名称、表单、执行监听器这些....

 

一、表单

我们可以看到上面两张图里面都有表单的引用,这个表单的引用是干嘛的?

结合实际:我们正常需要请假的时候,首先是会填一下请假天数、请假事由等等信息。这个表单引用就是对应的我们填写的表单信息的id。flowable自动生成的act_*相关的表中并没有存储表单的数据库表。

所以若依框架的作者是自己建了一个动态拖拽的表单设计器数据库表。

当然只要有这张表就行,能获取到这个表单信息,并不一定非得是动态表单,也可以自己画好页面,然后把代码复制进来,一样的效果。但此时还是先按照已有的进行学习。

首先,我们点击开始节点,然后在右侧表单选择之前设计好的表单。这样在实际发起流程的时候就能查询出来这个表单,并且让用户进行填写。

(其中需要明白的是:用户填的这些参数,在整个流程中都是属于“流程变量”,当然也可以设置一些隐藏的不在表单中展示的流程变量。一般填写好都不会改变,但是下面监听器的演示会提到流程变量的概念,提前知道一下)

 

二、执行监听器

“监听器”在flowable中主要分成两种,一个是执行监听器、一个是任务监听器。任务主要是像一些审批节点的算是任务,startEvent属于事件,所以在开始事件中只有执行监听器没有任务监听器。

执行监听器为什么存在?主要我们可以动态的去设置一些事情:

动态分配节点的处理人;

流程到哪个节点了,我要动态的去通知一些人,比如发邮件;

处理一些其他的业务等等

执行监听器一般有三个类型:start、take、end

<flowable:executionListener class="com.ruoyi.system.listener.StartEventListener" event="start">

<flowable:executionListener class="com.ruoyi.system.listener.EndEventListener" event="end" />

<flowable:executionListener class="com.ruoyi.system.listener.TakeEventListener" event="take" />

start:开始  end:结束  take:执行过程中(我的理解是触发)

(有人说start和end是用于任务和节点上的,而take是用在连线上的)

 

但是,使用若依的时候会发现,无论点哪个事件或者连线都只有start和end两种类型。

也很好理解,take和start的作用可以说是基本一致,都是在节点开始或者被触发的时候会调用。所以你如果加入一个take类型也是一样的,但是如果全被start代替会显得更加简单。

执行监听器实现

可以从下图看到监听器有几种实现方式

官方:java类、表达式、委托表达式

若依:java类、表达式、代理表达式、脚本(脚本后续在任务其他节点进行讲解)

前三个一样,只不过多了一个脚本。

我们接下来看看具体怎么使用。

1、Java类实现

在Spring项目中,执行监听器只需要在你创建的类上面实现ExecutionListener即可。如下:

这是我创建的start和end类型的监听器,同时绑定在了开始事件上。里面的参数(name、age)先不用管。

我分给startEvent绑定了两个监听器,也就是提交任务的时候会触发两次。

package com.ruoyi.system.listener;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.flowable.engine.impl.el.FixedValue;
import org.springframework.stereotype.Component;

@Component
@Slf4j
@Data
public class StartEventListener implements ExecutionListener {
    private FixedValue name;
    private Expression age;

    @Override
    public void notify(DelegateExecution execution) {
        log.info("execution>>>>>>>>>>>>>>>>>>>>>>:{}", execution.getProcessDefinitionId());
        log.info("name>>>>>>>>>>>>>>>>>>>>>>:{}", name.getValue(execution));
        log.info("age>>>>>>>>>>>>>>>>>>>>>>:{}", age.getValue(execution));
    }
}
package com.ruoyi.system.listener;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
@Data
public class EndEventListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution execution) {
        log.info("execution>>>>>>>>>>>>>>>>>>>>>>:{}", execution.getProcessDefinitionId());
    }
}

可以看到DelegateExecution里面就包含了流程实例id等其他信息,可以做一些处理。后面讲

等start事件处理完后就条转到了end执行器

上面就是java类方式的执行监听器实现方法,可能大家也注意到了,我的start监听器里面还配置了参数。那么参数具体是做什么用的呢?

下面来看看官方和若依的界面区别

 可以看到,就是我触发了这个执行器后,要带进来哪些自定义的参数。主要还是为了实现个性化处理,流程图一般都是固定的,但是我不同的分支带进来不同的参数,我就可以根据参数处理不同的业务。

private FixedValue name;//用于接收字符串
private Expression days;//用于接收表达式

字符串如下:

此时你看  我就可以根据动态传进来的name判断处理不同的逻辑

有人会说了,你都固定写死了张三  那还有什么逻辑可分?

当然不是了,你要知道这个监听器是可以绑定在任意一个节点上的。如下图,就会发现如果两个节点分别都关联了同一个监听器。那么他们一个配置name是张三一个配置name是李四,是不是就不一样了?

表达式如下:

表达式必须是el表达式${param==1},就是跟上面的原理差不多,不同的节点可以传不同的值,我目前发现还是字符串用的多,简单还不需要解析,你看表达式还得单独处理,麻烦!!!

 

2、表达式

执行监听器-表达式方式处理。

他的xml流程是这样的

<flowable:executionListener expression="${execution.setVariable(&#34;days&#34;,10)}" event="end" />

由下图可以看出,我在设计图上是用户填完请假表单,会通过一个排他网关(就是哪个X)。他会判断我的表单里面输入的天数是几,如果>3就走上面的流程,如果<3就走下面的流程。

比如:下面是一个正常的流程 

我们可以看到具体的实例走向:

但此时如果我在排他网关前面加一个表达式触发器,就可以直接改变这个走向:

也就是开始事件结束后就会触发这个表达式,表达式的内容是${execution.setVariable("days",10)}。为什么这么写,我们待会再说,先看效果。

可以明显看到他走到了另外一个分支上去了,也就是${execution.setVariable("days",10)}这个表达式把流程参数days改成了10。

至于为什么这么写可以看下代码:

我们前面手动添加的监听器都是继承了ExecutionListener.java

但是表达式可以发现,他里面并没有引用java类,那他到底怎么实现的呢?我们可以先看一下这个父类具体有哪些实现类:

那有人会问,为什么这么写呢execution?不妨点进去看一下:

execution就是他的默认参数就代表DelegateExecution。

然后我们再看一下DelegateExecution里面的默认方法有多少,可以看到我们上面表达式就是用的这个方法setVariable(),可以改变流程变量的值。这里面的方法都是可以使用的。

其实有人可能也会发现,表达式监听器也可以带参数,只不过我目前发现并没有多大的作用。它实际的使用可以是这样:

 

但是这么使用倒不如直接把张三写在上面了!!!可能是我目前还没遇到具体的场景,先记住 后续遇到再说。

3、代理表达式

其实表达式和代理表达式都是在整个流程过程中,动态的去处理一些旁支业务。但是

表达式更倾向于去判断某个值,或者计算某个值从而达到动态的更改流程的分支走向。

代理表达式则是倾向于指定服务运行哪个javabean或者bean.方法。

他的实现主要就是自定义一个类然后实现implements JavaDelegate。但是此时我要写一个更加直观的方式:

其实到这里今天的差不多写完了,但是抬头看了一下标题:

“今天只讲开始事件”

貌似今天的大部分内容并不全是开始事件特有的,也别是执行监听器,任何一个节点都可以配置。这也是我今天的收获。至少知道了怎么使用几种表监听器。其实问了一下朋友,他们说平时用的比较多的就是java类实现方式和表达式这两种。

那么后续如果涉及到的例子中,我也尽量多使用这两种方式进行测试。

希望,对你能有一点点的启发。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PostgreSQL】从零开始:(六)PostgreSQL-数据库目录文件结构及作用说明

数据库文件目录结构 ├── bin #系统工具目录 │ ├── clusterdb │ ├── createdb │ ├── createuser │ ├── dropdb │ ├── dropuser │ ├…

JVM调优排错专题

JVM调优排错专题 1 打开MAT报错 1 打开MAT报错 下载了linux版本的 MAT 软件&#xff0c;1.15.0版本。 下载地址&#xff1a;https://eclipse.dev/mat/downloads.php 运行时报错了。 错误截图 报错日志 wittasus:/usr/develop/mat$ ./MemoryAnalyzer Unrecognized option:…

springCould-从小白开始【1】

目录 1.说明 2.父工程 3.服务端 4.消费者 5.公共模块 6.RestTemplate 1.说明❤️❤️❤️ 创建三个模块&#xff0c;服务者&#xff0c;消费者&#xff0c;公共api 注&#xff1a;spring boot和spring cloud有版本约束 2.父工程 ❤️❤️❤️ 约定版本号配置 注意&…

Leetcode: 203. 移除链表元素

题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 难度&#xff1a;简单 题目链接&#xff1a;203. 移除链表元素 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val …

51单片机LED与无源蜂鸣器模块

IO口的使用1 本文主要对51单片机的LED灯的使用以及蜂鸣器的使用进行介绍&#xff0c;其中包括一些实例分析&#xff1a; 1.实现发光二极管的从左到右的流水点亮 2.左右来回循环的流水灯 3.蜂鸣器以一定频率响 文章目录 IO口的使用1一、LED灯举个栗子一举个栗子二 二、蜂鸣器2.1…

Ebullient第一阶段开发小结

一. 简介 距离Ebullient硬件发布已有一段时间&#xff0c;小一个月吧&#xff0c;在这段时间内在努力的编写代码&#xff0c;现在终于完成了第一阶段的功能设计&#xff0c;算是一个小型的样机吧&#xff0c;基本的代码框架基本确定了&#xff0c;相信后续的会快一点(希望如此…

创建自定义 gym env 教程

gym-0.26.1 pygame-2.1.2 自定义环境 GridWolrdEnv 教程参考 官网自定义环境 &#xff0c;我把一些可能有疑惑的地方讲解下。 首先整体文件结构, 这里省略了wrappers gym-examples/main.py # 这个是测试自定义的环境setup.py gym_examples/__init__.pyenvs/__init__.pygri…

Oracle的学习心得和知识总结(三十一)| ODBC开放式数据库连接概述及应用程序开发

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

网工内推 | 美团、中通快递,网络运维,最高30K*15薪

01 美团 招聘岗位&#xff1a;网络运维开发工程师 职责描述&#xff1a; 1.负责新零售业务门店/仓库网络的日常运维、故障处理、应急响应&#xff0c;保障网络及相关业务的稳定运行&#xff0c;处理突发事件、对疑难问题进行跟踪并最终解决。 2.负责新零售业务门店/仓库网络的…

Neural Network——神经网络

1.feature reusing——特征复用 1.1 什么是特征复用 回顾我们之前所学习的模型&#xff0c;本质上都是基于线性回归&#xff0c;但却都可以运用于非线性相关的数据&#xff0c;包括使用了如下方法 增加更多的特征产生新的特征&#xff08;多项式回归&#xff09;核函数 在本身…

router全局守卫beforeEach导致infinite redirect in navigation guard 问题

问题背景 路由加了全局守卫之后&#xff0c;报错&#xff1a; 分析原因 内部判断&#xff0c;导致路由产生了死循环 错误代码 router.beforeEach((to, from, next) > {if (store.getters.token) {if (to.path /login) {next(/)} else {next()}} else {next(/login)} })…

MeterSphere files 任意文件读取漏洞复现 (CVE-2023-25573)

0x01 产品简介 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能,全面兼容 JMeter、Selenium 等主流开源标准。 0x02 漏洞概述 MeterSphere /api/jmeter/download/files 路径文件存在文件读取漏洞,攻击者可通过该漏洞读取系统重要…

卸载MySQL——Windows

1. 停止MySQL服务 winR 打开运行&#xff0c;输入 services.msc 点击 “确定” 调出系统服务。 我这里只有一个&#xff0c;只要是以MySQL开头的全部停止 2. 卸载MySQL相关组件 打开控制面板 —> 卸载程序 —> 卸载MySQL相关所有组件 3. 删除MySQL安装目录 一般是C:\P…

win11 wsl2安装

参考视频 微软商店直接下载以后&#xff08;提前打开虚拟化&#xff0c;linux子系统选项&#xff09; 设置为wsl2 wsl --set-default-version 2然后直接打开即可 可能遇到的问题 WSL2 占位程序接收到错误数据。 Error code: Wsl/Service/0x800706f7 管理员权限启动,重启 …

蓝桥杯嵌入式——串口

CUBE里配置成异步模式&#xff0c;设置波特率&#xff0c;打开中断&#xff08;先配置LCD再配置串口&#xff09;&#xff1a; 串口发送 main.c #include "string.h" char temp[20]; sprintf(temp,"Hello World\r\n"); HAL_UART_Transmit(&huart1,(…

AutoSAR(基础入门篇)1.3-AutoSAR的概述

目录 一、到底什么是AutoSAR 1、大白话来讲 2、架构上来讲 应用软件层(APPL) 实时运行环境&#xff08;RTE&#xff09; 基础软件层(BSW) 3、工具链上来讲 二、AutoSAR的目标 一、到底什么是AutoSAR 1、大白话来讲 AUTOSAR 就是AUTomotive Open System ARchitecture的…

文件操作学习总结

磁盘上的⽂件是⽂件。 但是在程序设计中&#xff0c;我们⼀般谈的⽂件有两种&#xff1a; 程序⽂件、数据⽂件 &#xff08;从⽂件功能的⻆度来分类 的&#xff09;。 程序⽂件 &#xff1a; 程序⽂件包括源 程序⽂件&#xff08;后缀为.c&#xff09; , ⽬标⽂件&#xff0…

【操作系统】|浅谈IO模型

I/O&#xff08;Input/Output&#xff09;指的是应用程序与外部环境之间的数据交换。I/O 操作涉及从外部设备&#xff08;如硬盘、网络、键盘、鼠标等&#xff09;读取数据或向外部设备写入数据。 操作系统启动后&#xff0c;将会开启保护模式&#xff1a;将内存分为内核空间&…

Linux I/O神器之io_uring

io_uring 是 Linux 于 2019 年加入到内核的一种新型异步 I/O 模型&#xff0c;io_uring 主要为了解决 原生AIO&#xff08;Native AIO&#xff09; 存在的一些不足之处。下面介绍一下原生 AIO 的不足之处&#xff1a; 系统调用开销大&#xff1a;提交 I/O 操作和获取 I/O 操作…

Unity中 URP 下的棋盘格Shader

文章目录 前言一、制作思路法1&#xff1a;使用纹理采样后&#xff0c;修改重铺效果法2&#xff1a;计算实现 二、粗略计算实现棋盘格效果1、使 uv.x < 0.5 区域 0 。反之&#xff0c; 0.52、使 uv.y < 0.5 区域 0 。反之&#xff0c; 0.53、使两个颜色相加4、取小数…