极简 Java 工作流概念入门

article/2025/9/30 10:28:16

1. 为什么需要工作流

假设我有一个请假需求,流程如下:

请假可以提交给我的上司,上司可以选择批准或者拒绝,无论批准还是拒绝,都会给我一个通知。

这个流程比较简单,我们很容易想到解决方案,不用工作流也能解决,有一个专门的请假表,当 A 要请假的时候,就往请假表中添加一条记录,这条记录的内容包含了请假的天数、原因、请假的审批人 B 以及一个名为 status 的字段,这个 status 字段表示这个请假申请目前的状态(待审批、已批准还是已拒绝),然后 B 登录系统之后,在请假表中查询到了 A 的请假信息,然后选择批准,此时将 status  字段的值改一下就行了。

这个流程很简单,相信小伙伴们都能想到。

然而,这是一个非常简单的流程,对于这样的流程,一般来说也确实没有必要使用工作流,但是现实中,我们涉及到的工作流往往都是非常复杂的,我举个例子,就说报销审批吧,这个可能很多小伙伴都经历过。

小伙伴们看到,这个流程相对来说还是比较复杂的,此时你再用一个 status 字段去描述,就很难说的请到底是怎么回事了。每一步审批,都有可能批准也有可能拒绝,拒绝并不意味着流程结束,员工修改报销资料之后,还可以继续提交。此时如果还用 status 去描述,那么 status 将有 N 多个值去表示不同的情况,这个维护起来非常不便。

这就复杂了吗?非也非也,我们再来看一个生产笔记本电脑的例子,假设公司研发了一款新型笔记本电脑,整个研发到生产的流程可能是这样:

相比上面两个,这个就更复杂一些了,不仅有串行任务还有并行任务,如何去设计这样一个系统?单纯的通过状态字段去描述显然已经不够用了,此时我们就得考虑一种通用的、更易维护的方案来实现这样的系统了,这种通用的、易维护的方案,也就是工作流。

2. 三大工作流

一个比较早的工作流是 jBPM,这是一个由 Java 实现的企业级流程引擎,是 JBoss 公司开发的产品之一。

jBPM 的创建者是 Tom Baeyens,这个大佬后来离开了 JBoss,并加入到 Alfresco,并推出了基于 jBPM4 的开源工作流系统 Activiti,而 jBPM 则在后续的代码中完全放弃了 jBPM4 的代码。从这个过程中也能看出来,jBPM 在发展过程中,由于意见相左,后来变成了两个 jBPM 和 Activiti。

然而戏剧的是,Activiti5 没搞多久,从 Activiti 中又分出来一个 Camunda,Activiti 继续发展,又从中分出来一个 Flowable。。。

由于开发 jBPM、Activiti、Camunda 以及 Flowable 的人多多少少有一些关联性,让人不得不猜测意见相左拉一票人出来单干是他们的企业文化。

所以现在市面上主流的流程引擎就一共有三个:

  • Activiti

  • Flowable

  • Camunda

这三个各有特点:

  1. Activiti 目前是侧重云,他目前的设计会向 Spring Cloud、Docker 这些去靠拢。

  2. Flowable 核心思想还是在做一个功能丰富的流程引擎工具,除了最最基础的工作流,他还提供了很多其他的扩展点,我们可以基于 Flowable 实现出许多我们想要的功能(当然这也是小伙伴们觉得 Flowable 使用复杂的原因之一)。

  3. Camunda 相对于前两个而言比较轻量级,Camunda 有一个比较有特色的功能就是他提供了一个小巧的编辑器,基于 bpmn.io 来实现的(松哥之前已经发文讲过了)。如果你的项目需求是做一个轻巧的、灵活的、定制性强的编辑器,工作流是嵌入式的,那么可以选择 Camunda。

如果仔细比较起这三个的差异,能列一个长长的表格,这个网上也有不少人都总结过了,松哥这里也就不啰嗦了。

3. 流程图

既然有三个不同的工作流,那么三个不同的工作流画出来的流程图是否都各不相同呢?

不是的。

工作流程图这块其实有一个统一的标准,那就是 BPMN。BPMN 全称是 Business Process Model and Notation,中文译作业务流程模型和标记法,这个中文太绕口了,还是简称 BPMN 吧。

这是一套图形化表示法,用图形来表示业务流程模型。BPMN 最初由业务流程管理倡议组织(BPMI, Business Process Management Initiative)开发,BPMI 于 2005 年与对象管理组织(OMG, Object Management Group)合并,并于 2011 年 1 月 OMG 发布 2.0 版本,同时改为现在的名称。

一句话,就是流程图这块有一个特别古老的规范,那就是 BPMN,而我们前面所说的无论是 Activiti、Flowable 还是 Camunda,都是支持这个规范的,所以呢,无论你使用哪一个流程引擎,都可以使用同一套流程图。

那么这个规范究竟都说了些什么事情呢?

我们以上面生产笔记本的流程图为例,来和小伙伴们做一个简单介绍:

从上图中可以看到,一个流程图中主要包含四方面的内容:

  • 事件

  • 连线

  • 任务

  • 网关

我们一个一个来说。

事件

首先在一个流程图中应该有开始事件和结束事件,也就是上图大家看到的两个圆圈。另外还有一些中间事件、边界事件等。举个中间定时事件的例子,比如用户下单之后,可以有一个中间定时事件,延迟 5 分钟发货。

连线

连线就是将事件、任务、网关等连在一起的线条,一般情况下就是普通连线,有的时候连线会有一些条件,例如松哥之前文章和大家分享的请假,如果经理同意请假申请,就走哪一个线条,如果经理不同意请假申请,就走哪一个线条。对应上图的笔记本生产,如果经理审批通过,就载入图纸准备生产,如果经理审批不通过,就重新设计。

任务

任务这块其实有很多分类。

如果细分大致上可以分为如下几种:

  • 接收任务

在上面的流程图中,等待准备工作完成这一项就是一个接收任务。这个任务里并不需要额外做什么事情,流程到这一步就自动停下来了,需要人工去点一下,推动流程继续向下执行。

  • 发送任务

这个一般用来把消息发送给外部参与者。

  • 服务任务

这个一般由系统自动完成,其实说白了就是我们的一个自定义类,可以在一个自定义类里边完成想要做的事情。

  • 脚本任务

一个自动化活动。当流程执行到脚本任务时,自动执行相应的脚本。

  • 业务规则任务

BPMN2.0 新引入用来对接业务规则引擎,业务规则任务用于同步执行一个或多个规则。

  • 用户任务

用于为那些需要由人工参与者完成的工作建模。

虽然细分类别很多,但是仔细看,其实这几种又可以归为两大类:

  1. 用户任务:表示人工要介入做的事情。比如同意与否,或者输入一些参数,要让人工完成任务,就需要一个表单系统,让人工输入数据,或者显示数据给人看,这也是为什么用户任务和表单系统结合在一起的原因,用户任务需要用户向引擎提交一个完成任务的动作,否则流程会暂停在这里等待。

  2. 服务任务:表示机器自动做的事情。调用服务的任务,这个服务可以是一个 Spring JavaBean,也可以是一个远程 REST 服务,流程会自动执行服务任务。

活动

活动可以算是一种特殊的任务。活动可以调用另外一个流程使之作为当前流程的子流程去运行。活动也可以分为用户活动、脚本活动等等。从显示上来说,活动比任务边框深一些。仅此而已。

网关

网关要是细分起来,也有很多不同类型的网关。

  • 互斥网关

这种网关也叫排他性网关,我们之前请假流程中的那个网关,就是互斥网关。这种网关有且仅有一个有效出口。

  • 相容网关

这种网关会有多个出口,只要条件满足,都会执行。

  • 事件网关

事件网关是通过中间事件驱动,它在等待的事件发生后才会触发决策。基于事件的网关允许基于事件作出决策。

  • 并行网关

并行网关一般是成对出现的,上面生产笔记本的那个流程中,生产屏幕、键盘等并行操作,就是通过并行网关来实现的。

好啦,这就是关于流程引擎的一些基本概念,捋顺了这些基本概念,在回过头看我们前面几篇关于流程引擎的文章,应该会有一些不一样的理解:

  • Spring Boot 整合流程引擎 Flowable,so easy!

  • SpringBoot+Vue+Flowable,模拟一个请假审批流程!

  • 49张图带领小伙伴们体验一把 Flowable-UI

  • Spring Security + Vue + Flowable 怎么玩?


http://chatgpt.dhexx.cn/article/BUioVSPG.shtml

相关文章

Java工作流详解(附6大工作流框架对比)

目录 1.什么是工作流 2.工作流应用场景 3.工作流实现方式 4.有哪些工作流框架? 5.1.Activiti6. 2.Flowable7. 3.Camunda8.4.jBPM9. 5.osworkflow,6.jflow. 10.工作流框架对比 什么是工作流工作流(Worklow) 工作流是对工作流程及其各操作步骤之间业务规则的…

smalldatetime类型

1、MS Sql Server 的smalldatetime 与datetime类型的区别 原来数据库字段为smalldatetime类型, update table set column 11:59:30 发现commit后db中的值为12:00:00 update table set column 11:59:29 发现commit后db中的值为11:59:00 原来smalldatetime是不存储秒…

SQL Server中smalldatetime的日期范围为何是[1900-01-01,2079-06-06]

本文目录列表: 1、SQL Server中的基准日期 2、smalldatetime的日期范围 3、smalldatetime的日期范围和无符号2字节整数的关系 4、总结语 5、参考清单列表 SQL Server中的基准日期 SQL Server 中针对datetime和smalldatetime这两个日期时间数据类型提供一个基准日期&…

smalldatetime mysql_SQL 中 date 与datetime的区别

潇潇雨雨 我们看看这几个数据库中(mysql、oracle和sqlserver)如何表示时间mysql数据库:它们分别是 date、datetime、time、timestamp和year。date :“yyyy-mm-dd”格式表示的日期值 time :“hh:mm:ss”格式表示的时间值 datetime:…

SQL datetime和smalldatetime区别

datetime 存储大小8个字节,精确到分后的3为小数,日期范围从1753 年 1 月 1 日到 9999 年 12 月 31 日;而 smalldatetime存储大小为4个字节,精确到分,日期范围从1900 年 1 月 1 日到 2079 年 6 月 6 日。 参考 http://m…

170406回顾-SQL Server的smalldatetime类型比较

在比较SQL Server的类型为smalldatetime字段时出现下面的错误:将 expression 转换为数据类型 smalldatetime 时出现算术溢出错误 正确的比较方法如下:将long型转换为时间格式的字符串,再与smalldatetime类型的字段比较 SELECT * FROM tablename WHERE EditFlag > 2017/…

【SQL Server】将字符串转换为 smalldatetime 数据类型时失败

如下图,我在执行下列语句时遇到了“将字符串转换为 smalldatetime 数据类型时失败”的报错 然后去搜了一下,原来是存储过程的问题,我看的是其他博主的解答(但是还没有按照博主的方法实践过),内容详情有需要的自己去搜一…

android笔记1(activity跳转)

1.利用Android studio创建一个新项目,项目结构如下。 2.创建一个新的activity,用于跳转。 3.修改两个activity的布局,主activity中有一个输入文本框和一个按钮,实现点击按钮发送文本框的内容到第二个activity。第二个activity中有…

Activity 跳转的生命周期变化

1)Activity1跳转到Activity2的生命周期流程 1.Activity1启动:Activity1: onCreate()Activity1: onStart()Activity1: onResume()2.点击按钮跳转到Activity2:Activity1: onPause()Activity2: onCreate()Activity2: onStart()Activity2: onResume()Activit…

android activity跳转生命周期,Android中从一个Activity跳转到另一个Activity所经历的生命周期........

凡是Android开发人员都知道“Activity”是非常重要的;对其该“Activity”生命周期相信大家也比较熟悉了。 这篇文章主要探讨的是“从一个Activity启动跳转到另一个Activity中,所经历的生命周期中的过程” 实例: 1、MainActivity 启动 Secon…

Android开发之Activity(实现Activity跳转)

文章目录 基本框架新建activity实现activity跳转 基本框架 首先,每当我们新建一个APP工程,AS都会默认为我们创建一系列文件,比如MainActivity.java,该activity就是用户打开APP时默认弹出的activity,且该类一定要继承自…

activity跳转

1. 显示跳转 <Buttonandroid:layout_width"wrap_content"android:layout_centerHorizontal"true"android:layout_marginTop"20dp"android:text"页面跳转"android:onClick"intentClick"android:layout_height"wrap_c…

Android activity跳转使用详解

画面就是活动卡片,就是activity 继承 AppCompatActivity 的才是activity,否则就是一个普通的java类 案例:实现activity跳转 一 步骤 step1 new一个新的activity step2 看一下AndroidManifest.xml是否配置了新的activity step3 在MainActivity.java 里添加点击事件,跳转到acti…

Android Activity跳转

实现点击按钮&#xff0c;发送消息并跳转到另一个Activity MainActivity添加SendMessage方法 const val EXTRA_MESSAGE "com.example.myfirstapp.MESSAGE"class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super…

Activity跳转和Intent传值

Activity跳转和传值 1.重点内容 1.重点内容 Activity之间的跳转及数据传递&#xff08;如何跳转&#xff1f;如何返回&#xff1f;&#xff09;使用Intent在Activity之间传递数据&#xff09;&#xff08;单向和双向&#xff1f;&#xff09;回传数据&#xff08;怎么回传和…

android跳转界面动画,Android Activity跳转动画效果

Activity的跳转动画在5.0的时候做了一个重大的突破,下面来看一下吧 1.5.0之前的overridePendingTransition 相信大家对OverridePendingTransition还是很熟悉的,使用方法也是很简单就是 //fade_in是第二个界面的进入动画,fade_out是第一个界面退出动画,不想动画传入0 overri…

Activity之间跳转实现--安卓作业2

一.要求分析 目前已经利用adapter实现了将数据传输recycleview界面。这次作业主要是利用intent传递参数并实现activity之间的跳转 1.在Adapter中的内部类viewholder中设置一个监听&#xff0c;用于recyclerview中每一个item myviewholder.textView.setOnClickListener(new …

Activity的三种跳转

一个界面跳转到另一个界面&#xff0c;这就Activity的跳转。我们在开发中常见的跳转有三种。普通跳转、有返回值的跳转、透传跳转。我们先来看一种。 1 . Activity的普通跳转&#xff08;传值跳转&#xff09; 这个跳转是最简单的 Intent intentnew Intent(); intent.setCla…

如何使用正则表达式对输入数字进行匹配详解

前言&#xff1a; 最近有一个区间范围限制&#xff0c;一般255数字以下的都能在网上薅到&#xff0c;但是需要弄一个int16、int32、int64范围的输入限制......在网上逛了很久都没找到&#xff0c;基本都是从0开始教学那种&#xff0c;我又不想看&#xff0c;觉得写的范围太大了…

python正则表达式从字符串中提取数字

文章目录 python从字符串中提取数字使用正则表达式&#xff0c;用法如下&#xff1a;解题思路&#xff1a;代码如下&#xff1a; 匹配指定字符串开头的数字匹配包含指定字符串开头的数字匹配时间&#xff0c;17:35:24匹配时间&#xff0c;20181011 15:28:39 python从字符串中提…