最近进行的一次技术选型(工作流引擎)及相关知识介绍

article/2025/10/24 4:47:29

前言

最近有个新项目,需要实现类似工作流引擎的效果,如果不知道是啥,看完本文就懂了。

公司内其实也有些自研的,可能就是不像开源的这些那样,还支持这个那个规范,都是基于需求定制开发的,扩展性稍微差点。

所以,这次其实几个同事,分工调研了几个开源的和公司内的,开源的包括activiti、flowable、camunda,我这边主要调研了flowable、camunda,同事调研了activiti和公司内部的。

最终看下来,我们的需求,其实不需要用到这么复杂的开源框架,公司内的一个框架更符合一些。开源的框架,会建很多表,表也不符合公司内的建表规范,所以还需要阅读源码,去改造之类的,也比较麻烦。会引入很多jar包,总体来说,还是比较重。

文末有几个引擎的对比,大家有兴趣可以看看,也可以加我微信和我探讨(只花了两天时间,可能也了解得也比较粗略)。

最终来说,技术还是服务于需求的,不是因为框架牛逼就硬上,合适最重要。

先说说uml和omg

学过软件工程的同学,肯定知道uml,全称Unified Modeling Language,统一建模语言。建模,为啥要建模,因为软件研发过程较为抽象,一个需求来了,肯定要先分析分析,建个模(通俗就是:画个图),但是每个人画出来的图都不一样,比如uml里用一个小人来表示用户,有的人就不愿意用小人。所以,为了业界内人士沟通交流更方便,就定义了一套标准,每种图应该怎么画,包含了哪些部分。

比如uml包含了如下类型的图,每种图里,都有固定的图例来代表固定的意思(仅部分):

正在上传…重新上传取消

ok,大家明白了uml,我再说说omg是啥,omg是个标准化组织,致力于提出uml这样类似的标准,和业界的公司进行讨论交流,各公司的人、学术界的人、omg的人,共同讨论,提出一个大家都能接受的方案,然后大家就按照这个标准来进行实现。

世界上的标准化机构很多,omg手里拿出来的,现在广为使用的,被iso采纳的,有如下几个。

正在上传…重新上传取消

主要就是uml和bpmn,注意,没有xml(图里右上角那个是xmi)。

bpmn

图形规范

bpmn(Business Process Model And Notation)是啥,也是一种建模语言,和uml类似,就是规定:xxx,用这个来表示,yyy,用那个来表示。

bpmn主要是对工作流进行建模,大家公司里的oa系统,基本就是工作流的典范,比如下面这样一个用户请假流程,就是遵循bpmn规范的。

这个图里,哪些地方用空心圆,哪些地方是矩形,哪些地方用菱形,都是有讲究,这就是bpmn规范里定义的。

正在上传…重新上传取消

xml规范

bpmn对图形有规范,对图形背后的存储格式也有定义,这个图,最终会转化为一份xml,这份xml也是遵循特定的schema的。

正在上传…重新上传取消

上图这个xml,就是遵循omg官方的schema,里面最外层是一个process元素,里面的元素则只能是startEvent、sequenceFlow等。

这样标准化了之后,业界各个厂商,就可以各自开发一套实现,只要这套实现,最终能生成上面这样的xml,那就是符合bpmn的,拿这份bpmn文件到其他厂商那里,其他厂商的程序也能正确解析该文件,因此就实现了互联互通,这就是标准的力量。

bpmn版本历史

主要是4个版本,现在业界基本都是基于2010年的最新版本2.0进行实现,也就是bpmn2.0

VERSIONADOPTION DATEURL
2.0十二月 2010About the Business Process Model And Notation Specification Version 2.0
1.2一月 2009About the Business Process Modeling Notation Specification Version 1.2
1.1一月 2008About the Business Process Modeling Notation Specification Version 1.1
1.0三月 2007About the Business Process Model And Notation Specification Version 1.0

bpmn 2.0的业界实现

实现还是挺多的,近10多个。现在大家比较用得多的,还是红框的几个,Activiti、Camunda、Flowable、jBPM。

这些实现,互相有些关系,就像log4j的维护人后来又创建了logback一样。

目前主要就是在 Camunda/flowable 6/ activiti里面去选择。

flowable 内嵌模式快速了解

创建maven工程(文末有代码)

如果一上来,直接就开始比较各框架的差异,大家由于对其中任意一个都不了解,所以也没法参照。这里先讲一下flowable框架(目前最先了解这个框架)。

flowable 引擎,支持两种运行模式,一种是内嵌到业务服务中,咱们先讲这种。

先建一个普通的maven工程,加入flowable引擎的依赖以及h2内嵌数据库的依赖(正式项目会换成mysql等持久化数据库)

<!-- https://mvnrepository.com/artifact/org.flowable/flowable-engine --><dependency><groupId>org.flowable</groupId><artifactId>flowable-engine</artifactId><version>6.7.2</version></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>1.4.192</version></dependency>

创建流程引擎实例

以下,先创建一个引擎实例出来:

import org.flowable.engine.ProcessEngine;
import org.flowable.engine.ProcessEngineConfiguration;
import org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration;public class HolidayRequest {public static void main(String[] args) {ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration().setJdbcUrl("jdbc:h2:mem:flowable;DB_CLOSE_DELAY=-1").setJdbcUsername("sa").setJdbcPassword("").setJdbcDriver("org.h2.Driver").setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);ProcessEngine processEngine = cfg.buildProcessEngine();}}

接下来,我们就可以往这个引擎实例上部署一个流程xml。比如,假设我们最终想建立一个员工请假流程,那么,我们可以通过各种办法(如flowable自带的web-ui拖拽的方式或手动创建xml等),来建立一个下面这样的,符合bpmn2.0规范的流程定义xml(holiday-request.bpmn20.xml)。

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:activiti="http://activiti.org/bpmn"typeLanguage="http://www.w3.org/2001/XMLSchema"expressionLanguage="http://www.w3.org/1999/XPath"targetNamespace="http://www.flowable.org/processdef"><process id="holidayRequest" name="Holiday Request" isExecutable="true"><startEvent id="startEvent"/><sequenceFlow sourceRef="startEvent" targetRef="approveTask"/><!--        <userTask id="approveTask" name="Approve or reject request"/>--><userTask id="approveTask" name="Approve or reject request" activiti:candidateGroups="managers"/><sequenceFlow sourceRef="approveTask" targetRef="decision"/><exclusiveGateway id="decision"/><sequenceFlow sourceRef="decision" targetRef="externalSystemCall"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${approved}]]></conditionExpression></sequenceFlow><sequenceFlow sourceRef="decision" targetRef="sendRejectionMail"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${!approved}]]></conditionExpression></sequenceFlow><serviceTask id="externalSystemCall" name="Enter holidays in external system"activiti:class="org.example.CallExternalSystemDelegate"/><sequenceFlow sourceRef="externalSystemCall" targetRef="holidayApprovedTask"/><!--        <userTask id="holidayApprovedTask" name="Holiday approved"/>--><userTask id="holidayApprovedTask" name="Holiday approved" activiti:assignee="${employee}"/><sequenceFlow sourceRef="holidayApprovedTask" targetRef="approveEnd"/><serviceTask id="sendRejectionMail" name="Send out rejection email"activiti:class="org.flowable.SendRejectionMail"/><sequenceFlow sourceRef="sendRejectionMail" targetRef="rejectEnd"/><endEvent id="approveEnd"/><endEvent id="rejectEnd"/></process></definitions>

这个xml是不是比较抽象?这个xml就类似于一种标准格式,就像java的class文件一样,实现跨平台的效果。

该xml对应的流程图如下:

接下来,我们就把这个文件,传给流程引擎,让它基于该文件,创建一个工作流。

RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("holiday-request.bpmn20.xml").deploy();

创建后,实际就写到内存数据库h2了,此时,我们还可以把它查出来

ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
System.out.println("Found process definition : " + processDefinition.getName());

创建工作流实例

工作流实例,一开始需要一些输入参数,员工不是需要请假吗,我们就需要:员工姓名、请假天数、事由等。

Scanner scanner= new Scanner(System.in);System.out.println("Who are you?");
String employee = scanner.nextLine();System.out.println("How many holidays do you want to request?");
Integer nrOfHolidays = Integer.valueOf(scanner.nextLine());System.out.println("Why do you need them?");
String description = scanner.nextLine();RuntimeService runtimeService = processEngine.getRuntimeService();Map<String, Object> variables = new HashMap<String, Object>();
variables.put("employee", employee);
variables.put("nrOfHolidays", nrOfHolidays);
variables.put("description", description);

ok,参数准备好了,就准备传给工作流了:

ProcessInstance processInstance =runtimeService.startProcessInstanceByKey("holidayRequest", variables);

此时,就会根据流程定义里的:

<userTask id="approveTask" name="Approve or reject request" activiti:candidateGroups="managers"/>

创建一个任务,任务有个标签,就是candidate group,这里是manager,可以猜得出,是给manager建了个审批任务。

manager查询并审批任务

以下,基于manager查询任务:

TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list();
System.out.println("You have " + tasks.size() + " tasks:");
for (int i=0; i<tasks.size(); i++) {System.out.println((i+1) + ") " + tasks.get(i).getName());
}

我们可把任务打印出来看看:

System.out.println("Which task would you like to complete?");
int taskIndex = Integer.valueOf(scanner.nextLine());
Task task = tasks.get(taskIndex - 1);
Map<String, Object> processVariables = taskService.getVariables(task.getId());
System.out.println(processVariables.get("employee") + " wants " +processVariables.get("nrOfHolidays") + " of holidays. Do you approve this?");

审批任务:

boolean approved = scanner.nextLine().toLowerCase().equals("y");
variables = new HashMap<String, Object>();
variables.put("approved", approved);
taskService.complete(task.getId(), variables);

这里就是把全局变量 approved,设为了true,然后提交给引擎。引擎就会根据这里的变量为true还是false,走不同分支。对应了:

回调用户代码--用户开始休假

上面审批后,就会进入下一个节点:休假。

<serviceTask id="externalSystemCall" name="Enter holidays in external system"activiti:class="org.example.CallExternalSystemDelegate"/>

这里有个class,就是需要我们自己实现的。

然后,基本流程就自己走完了。

flowable rest-api模式

简介

上面那种,是其作为一个jar,内嵌到我们的程序里,创建引擎对下。由我们业务程序去驱动引擎的运行。引擎和业务代码在同一个进程。

其实,flowable也可以作为一个独立服务运行,提供rest-api出来,这样的话,非java语言的开发者也可以使用该引擎了。

这个只需要我们下载官方的zip包,里面有个rest的war包,我们丢到tomcat里运行。

上传工作流定义xml文件,部署工作流

如果要实现上面java-api那样的功能,我们就需要调接口来实现

正在上传…重新上传取消

下面就开始启动工作流:

其他接口就不一一展示了。可以参考文档。

flowable-ui,通过web ui进行流程xml建模

上面手工建立xml,还是比较累的,我们可以通过其提供的web ui来建模,省点力气。(不过也不是很好用,各种名词比较费解,大家可能还是要自己做一套前端界面,调用自己的接口,来生成一个xml文件)

上面的rest那一节,tomcat里就部署了一个flowable-ui的。

就可以通过下面这样的方式来建模。

正在上传…重新上传取消

其他方面

活跃程度:activiti是最活跃的,activiti (非常活跃,一天一个alpha版本)> camunda(一个月一个alpha版本) > flowable(几个月或半年一个版本)

依赖:会引入37个jar包,当前最新的6.7.2版本

mysql:核心建表语句为7张,历史表5张;程序运行后,结果有47张表,具体原因暂时没去研究

持久层框架:写mysql表时,使用mybatis

引擎对比

正在上传…重新上传取消


http://chatgpt.dhexx.cn/article/9b7yiKXe.shtml

相关文章

java工作流引擎(j-roadflow)快速入门教程

使用j-roadflow java工作流引擎创建一个流程分为两个步骤&#xff0c;创建表单和创建流程。 一、创建表单。 在流程管理--表单管理下点新建表单即开始创建一个新的表单&#xff1a; 点击之后打开表单设计器并弹出表单属性设置&#xff1a; 表单名称&#xff1a;为您新建的表单…

为什么使用工作流引擎,什么是工作流引擎,工作流引擎选型以及如何使用

文章目录 为什么使用工作流引擎&#xff1f;不使用工作流存在以下问题工作流优缺点 什么是工作流引擎尝试自己构建工作流引擎有哪些选型方案呢基于bpmn标准进行流程定义国产自定义 如何使用SnakerFlow工作流以请假流程来看下数据库中数据流转情况初始状态员工发起请假申请 常见…

工作流引擎

1 绪论 【社会上的需求.】 1.1 课题的研究背景 工作流的概念起源于生产组织和办公自动化领域。它是针对日常工作中具有固定程序的活动而提出得一个概念。它的主要特点是使处理过程自动化&#xff0c;通过将工作分解成定义良好的任务、角色&#xff0c;按照一定的规则和过程来执…

LeaRun.Java工作流引擎 快速开发业务流程

工作流引擎是用来开发工作流转的框架。作为应用系统的一部分&#xff0c;能根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案&#xff0c;包含组织结构、流程、节点、转向规则等。 而低代码开发框架&#xff0c;是能够解决一个可以直接在后台配置就可以开…

IBPS java工作流引擎介绍

java工作流引擎是什么&#xff1f;看了这篇文章&#xff0c;相信80%的人都会明白的。IBPS低代码开发平台是近些年流辰信息的主打产品&#xff0c;实践证明&#xff0c;该产品推向市场后&#xff0c;得到了企业信息化部门、各高校、电力等企业的喜爱和支持。本文为大家着重介绍I…

Java开源工作流引擎有什么突出特点?

在高效办公需求日渐增长的当天&#xff0c;如何利用优质软件助力企业提升办公效率&#xff0c;是很多企业一直在寻觅的途径。Java开源工作流引擎可以借助其优势特点助力企业实现标准化发展&#xff0c;高效提高工作效率。那么&#xff0c;Java开源工作流引擎到底有什么用的突出…

后端web开发框架——Spring Boot

为什么使用Spring Boot 简化配置&#xff0c;无需编写太多的 xml 配置文件&#xff0c;效率很高&#xff1b;Spring 可以整合很多各式各样的框架&#xff0c;并能很好的集成&#xff1b;基于 Spring 构建&#xff0c;使开发者快速入门&#xff0c;门槛很低&#xff1b;Spring …

Web前端开发工具和框架

摘要&#xff1a;技术的快速发展让很多人学习起来无所适从&#xff0c;幸运的是&#xff0c;很多优秀的 Web 开发人员和设计人员在努力寻找各种有特色的解决方案。 因此&#xff0c;我们有了很多优秀的小工具和库&#xff0c;每一个都是用来解决特定的问题或维护一组特定的项目…

后端Web开发框架(Java)

本文节选自霍格沃兹测试学院内部教材 Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。讲的通俗一点就是 Spring …

Python中如何选择Web开发框架?

Python开发中Web框架可谓是百花齐放&#xff0c;各式各样的web框架层出不穷&#xff0c;那么对于需要进行Python开发的我们来说&#xff0c;如何选择web框架也就变成了一门学问了。本篇文章主要是介绍目前一些比较有特点受欢迎的Web框架&#xff0c;我们可以根据各个Web框架的特…

移动web开发框架研究

纯粹的总结一下移动web开发框架&#xff0c;移动web开发框架有jQuery Mobile 、Sencha Touch等等,他们都来源于web开发&#xff0c;是成熟的框架&#xff0c;jQuery Mobile出自于jQuery家族&#xff0c;Sencha Touch来自于ExtJS。jQuery Mobile 和Sencha Touch都是比较成熟老牌…

【Web开发】框架篇

前后端分离 为了适应技术和业务发展的需求&#xff0c;采用前后端分离的技术&#xff0c;前端应用和后端应用以JSON格式进行数据交互&#xff0c;采用的解决方案Spring Boot Vue。 单体——> 前端应用 后端应用 前端应用&#xff1a;负责数据展示和用户交互 后端应用&…

Python Web开发框架

一、WEB应用服务的认知 WEB应用服务基于HTTP协议/规范&#xff0c;实现静态资源和动态资源的请求与处理。 静态资源包括&#xff1a;html网页、图片、样式、javascript脚本、视频、音频等等。动态资源包括&#xff1a;通过程序&#xff08;java/php/python/.net&#xff09;和…

Web前端开发框架推荐

原本写这篇文章想围绕着 CSS 框架来的&#xff0c;但因为目前界内比较流行并遍地开花的主要还是 JSCSS 模式的框架&#xff0c;并且自己靠着一点 JS 功底&#xff0c;就想专门针对 CSS&#xff0c;所以最后来个大锅乱炖都大致聊聊。下面的框架也没有什么先后顺序之分&#xff0…

Java开源Web框架

URL&#xff1a;http://www.open-open.com/07.htm WebWork 点击次数&#xff1a;18070 WebWork 是由OpenSymphony组织开发的&#xff0c;致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。WebWork目前最新版本是2.1&#xff0c;现在的WebWork2.x前身是Rickard Oberg开发的…

37 个 Python Web 开发框架总结

1. Django 框架 官 网&#xff1a; https://github.com/django/django.git 优 点&#xff1a;是一个高层次 Python Web 开发框架&#xff0c;特点是开发快速、代码较少、可扩展性强。Django 采用 MTV&#xff08;Model、Template、View&#xff09;模型组织资源&#xff0c;框…

web框架

目录 1 左右分割窗口 2 上下分割窗口 3 嵌套分割窗口 4 内联框架 框架的作用是把浏览器窗口划分成若干个小窗口&#xff0c;每个小窗口可以分别显示不同的网页。 框架的基本结构主要分为框架集和框架两个部分&#xff0c;在网页中分别用<frameset>和<frame>标记…

热门开源Web开发框架推荐

程序员圈有这么一句话&#xff1a;“不要重复造轮子” &#xff0c;这句话也带来许多争议。 要不要重复造轮子&#xff1f; 有的人认为这是一种“拿来主义”的傲慢体现&#xff0c;因为你不造自己的轮子&#xff0c;就会缺乏核心技术&#xff0c;由此将一直受限&#xff0c;创…

Web框架介绍

&#x1f41a; 作者: 阿伟 &#x1f482; 个人主页: Flyme awei &#x1f40b; 希望大家多多支持&#x1f618;一起进步呀&#xff01; &#x1f4ac; 文章对你有帮助&#x1f449;关注✨点赞&#x1f44d;收藏&#x1f4c2; Web框架 文章目录 Web框架介绍1.web服务器ApacheNg…

常用的Web架构开发语言有哪几种?

如果你是做Web开发的&#xff0c;Web框架一定会很熟悉&#xff0c;框架是Web架构开发中必不可少的工具&#xff0c;不仅可以提高开发效率&#xff0c;还能让开发项目更成熟&#xff0c;并且可以提升代码的可再用性&#xff0c;Web框架开发离不开相应的开发语言&#xff0c;以下…