当前位置:首页 > 科技  > 软件

Flowable工作流引擎的科普与实践

来源: 责编: 时间:2023-08-05 11:45:03 3840观看
导读一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这种情况下,引入工作流引擎能够带来很多好处,让

一.引言

当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这种情况下,引入工作流引擎能够带来很多好处,让我们一起来看看:kLj28资讯网——每日最新资讯28at.com

  1. 开发成本的挑战:

在传统的手动审批系统中,开发人员需要从头开始设计和实现整个审批流程,包括流程逻辑、状态跟踪、任务分配等。这可能需要大量的时间和精力,尤其是在涉及到复杂的业务场景时。kLj28资讯网——每日最新资讯28at.com

使用工作流引擎,开发人员可以利用其强大的流程建模和执行功能,快速搭建审批系统。工作流引擎提供了图形化的流程设计工具,让流程建模变得简单易懂。这样,开发人员可以专注于业务逻辑的实现,大大降低了开发成本和周期。kLj28资讯网——每日最新资讯28at.com

  1. 业务复杂度的挑战:
  • 在实际的审批流程中,往往涉及到多个步骤、多个角色、多个条件等复杂情况。手动处理这些复杂的业务流程可能会导致流程不一致、流程控制不清晰等问题,增加了业务的复杂度和错误的可能性。
  • 工作流引擎提供了灵活的条件判断和分支网关功能,可以轻松处理复杂的审批流程。不同的业务场景可以在流程图中得到清晰的表达,从而确保流程的逻辑一致性和可控性。同时,Flowable引擎支持动态变量和表单的设置,使得审批系统能够满足不同业务场景的灵活需求。

通过引入工作流引擎,我们可以克服手动处理审批流程所带来的开发成本高和业务复杂度的挑战。它使得开发人员能够更专注于业务逻辑的实现,快速构建符合实际需求的审批系统。同时,流程图的可视化设计和条件判断的支持,使得业务流程更加清晰、透明,降低了错误发生的概率,提高了审批过程的效率和准确性。这将为企业带来更高的效益和竞争力。kLj28资讯网——每日最新资讯28at.com

图片图片kLj28资讯网——每日最新资讯28at.com

二.技术选型

目前市面上比较主流的几个工作流引擎包括Activiti、Flowable、Camunda等,体系较为成熟,使用最为广泛的是activiti,flowable跟activiti本质上没什么区别,是由activiti改版而来,但是两者后续发展路线则不一样,Activiti后续发展重心是在商业版与云上面,并未对核心功能与性能优化上有过多的跟进优化,而flowable当下重心则是针对功能性、扩展性、性能上进行迭代优化。kLj28资讯网——每日最新资讯28at.com

图片图片kLj28资讯网——每日最新资讯28at.com

当然,具体选型还是要看业务实际的需要,目前activiti迭代的方向并不是当下我们业务所需要的,我们更重视性能、扩展性这一块,而flowbale与Camunda之间为什么选择了flowable呢,则是因为flowable社区较为活跃,遇到并处理问题上更为效率,并且面对多节点审批时,异步任务是提升吞吐率的优质之选。kLj28资讯网——每日最新资讯28at.com

图片图片kLj28资讯网——每日最新资讯28at.com

下面我将简单介绍下flowable的一些功能以及模块。kLj28资讯网——每日最新资讯28at.com

三.Flowable引擎介绍

3.1 基础元素

  1. 流程定义(Process Definition):
  • 流程定义是业务流程的抽象表示,它描述了流程中各个环节的顺序和执行逻辑。

在Flowable中,流程定义通常使用BPMN 2.0标准(Business Process Model and Notation)进行建模,可以通过Flowable Modeler进行图形化设计。kLj28资讯网——每日最新资讯28at.com

  1. 流程实例(Process Instance):
  • 流程实例是流程定义的一个具体执行实例。每当一个流程启动时,就会创建一个新的流程实例,这个实例将遵循流程定义中规定的执行逻辑。
  • 每个流程实例都有一个唯一的标识符,用于跟踪和管理流程的执行状态。
  1. 任务(Task):
  • 任务表示流程中的具体工作单元,需要由参与者(用户或系统)完成。
  • 在Flowable中,任务可以是用户任务(Human Task)、服务任务(Service Task)、脚本任务(Script Task)等类型。
  1. 网关(Gateway):
  • 网关用于在流程中进行条件分支和合并操作,根据一定的条件来控制流程的走向。
  • Flowable提供了多种类型的网关,如排他网关(Exclusive Gateway)、并行网关(Parallel Gateway)等。
  1. 执行(Execution):
  • 执行代表了流程中的一个具体执行状态,包括当前的节点、变量值等信息。
  • 当流程实例执行时,会产生一系列执行对象,它们共同组成了流程的执行路径。
  1. 变量(Variable):
  • 变量用于在流程中传递和保存数据,可以在流程的不同节点间进行传递和共享。
  • Flowable允许在流程实例中动态添加、修改和删除变量。
  1. 监听器(Listener):
  • 监听器用于在流程的不同生命周期阶段监听事件,例如流程启动、流程结束、任务分配等事件。
  • Flowable支持多种类型的监听器,开发者可以根据需求自定义监听逻辑。

图片图片kLj28资讯网——每日最新资讯28at.com

这些是Flowable中的一些基础元素,它们构成了流程引擎的核心。通过这些元素,我们可以灵活地设计和管理复杂的业务流程,使得流程执行更加高效、透明和可控。kLj28资讯网——每日最新资讯28at.com

3.2 API说明

在调用开始之前,我们简单说明一下各个api的作用以及应用场景:kLj28资讯网——每日最新资讯28at.com

  1. RepositoryService:
  • RepositoryService用于管理流程和流程部署相关的操作。
  • 可以通过该Service部署、删除、查询流程定义,以及获取流程定义的资源文件等。
  1. RuntimeService:
  • RuntimeService用于管理流程实例的启动、挂起、终止等操作。
  • 可以通过该Service启动流程实例,查询流程实例状态,设置流程变量等。
  1. TaskService:
  • TaskService用于管理任务的创建、完成、分配等操作。
  • 可以通过该Service查询用户任务、完成任务,指定任务的办理人等。
  1. IdentityService:
  • IdentityService用于管理用户、组和用户组的操作。
  • 可以通过该Service创建、删除、查询用户和组,将用户加入到用户组等。
  1. HistoryService:
  • HistoryService用于查询流程实例和任务的历史数据。
  • 可以通过该Service查询已完成的流程实例、已完成的任务,以及历史的流程变量值等。
  1. ManagementService:
  • ManagementService用于执行一些底层的管理操作,如数据库表的创建、删除,作业的执行,引擎的配置等。
  • 一般情况下,开发人员不需要直接使用ManagementService,因为它执行的操作较为底层。

3.3系统数据表介绍

启动后会自动生成一些内置的系统表(如果不想自动生成可以通过配置关闭),这里简单介绍一下表的含义:kLj28资讯网——每日最新资讯28at.com

ACT_HI_*: 历史数据表,例如:kLj28资讯网——每日最新资讯28at.com

表名kLj28资讯网——每日最新资讯28at.com

含义kLj28资讯网——每日最新资讯28at.com

ACT_HI_PROCINSTkLj28资讯网——每日最新资讯28at.com

历史流程实例表,存储已完成的流程实例信息,包括流程开始时间、结束时间等。kLj28资讯网——每日最新资讯28at.com

ACT_HI_TASKINSTkLj28资讯网——每日最新资讯28at.com

历史任务实例表,存储已完成的任务实例信息,包括任务开始时间、结束时间、办理人等。kLj28资讯网——每日最新资讯28at.com

ACT_HI_VARIABLEkLj28资讯网——每日最新资讯28at.com

历史流程变量表,用于存储在流程运行时设置的变量信息。kLj28资讯网——每日最新资讯28at.com

ACT_RU_*: 运行时的数据表,节点结束时清除,例如:kLj28资讯网——每日最新资讯28at.com

表名kLj28资讯网——每日最新资讯28at.com

含义kLj28资讯网——每日最新资讯28at.com

ACT_RU_EXECUTIONkLj28资讯网——每日最新资讯28at.com

运行时流程执行实例表,存储当前正在执行的流程实例信息。kLj28资讯网——每日最新资讯28at.com

ACT_RU_TASKkLj28资讯网——每日最新资讯28at.com

运行时任务表,存储当前正在执行的任务信息。kLj28资讯网——每日最新资讯28at.com

ACT_RU_VARIABLEkLj28资讯网——每日最新资讯28at.com

运行时流程变量表,用于存储在流程运行时设置的变量信息。kLj28资讯网——每日最新资讯28at.com

另外,flowable支持定期清理历史数据,业务侧可以定义一个时间范围,超过时间范围可以认为数据可以被清理,系统内部会自行将数据物理删除,为历史表做瘦身操作。kLj28资讯网——每日最新资讯28at.com

不过我们业务侧接入的时候,往往业务需要创建几个符合我们具体业务场景的表,例如工单表、任务表虽然框架提供了,但是并没有记录详细的状态,这些状态是我们业务自己定义的,所以需要额外创建业务工单表、审批任务(节点)表、流水表等来进行数据上的冗余来满足实际的业务场景。kLj28资讯网——每日最新资讯28at.com

四.流程图建模绘制

4.1 BPMN 2.0协议

我们可以通过可视化后台绘制流程建模,生成BPMN格式的文件,那么BMPN又是什么呢?kLj28资讯网——每日最新资讯28at.com

BPMN(Business Process Model and Notation)是一种用于建模业务流程的标准化符号和语法,用于描述业务流程的各个环节和活动。BPMN的最新版本是BPMN 2.0,它是业务流程建模领域的国际标准,由OMG(Object Management Group)制定和发布。kLj28资讯网——每日最新资讯28at.com

BPMN 2.0的主要目标是提供一种统一的标准,使得不同人员和组织能够使用相同的符号和语法来建模和理解业务流程,从而增加流程的可视化和可读性。kLj28资讯网——每日最新资讯28at.com

它具有以下特点和优势:kLj28资讯网——每日最新资讯28at.com

  1. 图形化表示:
  • BPMN 2.0使用图形化符号来表示业务流程,包括开始事件、结束事件、任务、网关等。这些符号使得流程的设计和阅读更加直观和易懂。
  1. 丰富的元素:
  • BPMN 2.0定义了丰富的元素和连接方式,可以描述复杂的业务流程,包括顺序流、消息流、时间流等。
  1. 流程分支和合并:
  • BPMN 2.0支持多种类型的网关元素,如排他网关、并行网关等,用于实现条件分支和合并,使得流程的走向更加灵活。
  1. 子流程支持:
  • BPMN 2.0允许将复杂的业务流程分解为多个子流程,使得整体流程更易于管理和维护。
  1. 扩展性:
  • BPMN 2.0支持自定义属性和扩展元素,使得业务流程模型能够满足特定业务需求。
  1. 与执行引擎的结合:
  • BPMN 2.0是与执行引擎(如Flowable)无缝集成的,这使得通过工作流引擎执行流程变得更加高效和自动化。

4.2 绘制

我们可以从Flowable官网下载flowable-ui部署到本地来启动可视化后台,可以使用在线的Flowable Modeler来绘制,这里我们使用官网的flowable-ui来绘制。kLj28资讯网——每日最新资讯28at.com

具体下载启动过程我就不过多赘述了,flowable-ui是基于 springboot2.0开发的,可以直接以下方式来启动:kLj28资讯网——每日最新资讯28at.com

java -jar flowable-ui.war

启动成功后如图所示:kLj28资讯网——每日最新资讯28at.com

图片图片kLj28资讯网——每日最新资讯28at.com

我们打开建模器应用程序并点击【创建流程】按钮,我们可以给模型进行一个简单的定义.kLj28资讯网——每日最新资讯28at.com

图片图片kLj28资讯网——每日最新资讯28at.com

如图绘制了一个最简单的流程建模kLj28资讯网——每日最新资讯28at.com

图片图片kLj28资讯网——每日最新资讯28at.com

我们也可以给用户任务分配一些基础属性,这里我们配置一个固定用户, 当然这里也支持占位符来动态控制kLj28资讯网——每日最新资讯28at.com

图片图片kLj28资讯网——每日最新资讯28at.com

Image.pngkLj28资讯网——每日最新资讯28at.com

图片图片kLj28资讯网——每日最新资讯28at.com

这样一个最简单的流程建模(不含复杂节点、网关等)就绘制完毕了,绘制完成后会生成一个xml文件,kLj28资讯网——每日最新资讯28at.com

接下来我会从导入到执行来执行执行一遍该流程。kLj28资讯网——每日最新资讯28at.com

五.快速开始

5.1 导入starter

<dependency>            <groupId>org.flowable</groupId>            <artifactId>flowable-spring-boot-starter</artifactId>            <version>6.6.0</version>        </dependency>

5.2 导入建模

@Test public void createConfig() throws Exception{    File file = new File("/Users/xxx/Documents/flowbale/model/testModel.bpmn20.xml");    final FileInputStream fileInputStream = new FileInputStream(file);    final Deployment deploy = repositoryService.createDeployment()                .addInputStream("testModel.bpmn20.xml", fileInputStream).tenantId("类似于业务线的id,可以做数据隔离用")                .name("testModel").deploy();    System.out.println("id=" + deploy.getId()); }

5.3 查询流程建模的基本信息

@Test    public void getProcessDefinition() {        final ProcessDefinition rst =                repositoryService.createProcessDefinitionQuery().processDefinitionKey("testModel").orderByProcessDefinitionVersion().desc().list().get(0);        System.out.println(rst.toString());    }

5.4 创建审批工单

// processDefinitionKey 流程建模的key// businessId 具有业务属性的id// variableMap变量的map 结果会存入 ACT_RU_VARIABLE表中,如果审批人传入的是变量就需要再节点执行前将变量传入到系统中Map<String, Object> variableMap = new HashMap();variableMap.put("testUserList", Lists.newArrayList("nick","jack","tony"));String processDefinitionKey = "testModel";Long businessId = 1L;String tenantId = "1001";runtimeService.startProcessInstanceByKeyAndTenantId(processDefinitionKey, businessId + "", variableMap, tenantId);

5.5 获取待审批工单

final List<Task> taskList = taskService.createTaskQuery().taskAssignee("jack").list()

5.6 审批工单

Map<String, Object> variableMap = new HashMap();// 我们自己定义了一个内部标准化字段,flag代表着节点是通过还是驳回,在互斥网关判断通过驳回的时候会用到。variableMap.put("flag", 1);taskService.complete(taskId), variableMap);

5.7 事件监听

我们通过上述用例了解了一个工单是如何操作流转的,但是一个完整的审批服务是应该有消息推送的,当审批节点到达某个人需要提醒他进行审批操作,或者审批工单结束了需要通知发起人,我们应该如何操作呢?Flowable提供了便携的事件监听器,不需要我们额外编写代码来判断是否到达相应的节点,我们这里常用的就是节点创建、节点完成、流程结束等。kLj28资讯网——每日最新资讯28at.com

Flowable支持的事件有几十种,具体大家请自行去官网参考,下面仅展示“流程结束事件”监听器的代码用例:kLj28资讯网——每日最新资讯28at.com

package com.zhuanzhuan.workflow_engine.config;import com.zhuanzhuan.workflow_engine.listener.*;import lombok.extern.slf4j.Slf4j;import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType;import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher;import org.flowable.spring.SpringProcessEngineConfiguration;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationListener;import org.springframework.context.annotation.Configuration;import org.springframework.context.event.ContextRefreshedEvent;/** * @author:Live * @desc: * @date: 19:55 2023/1/13 */@Configuration@Slf4jpublic class FlowableListenerConfiguration implements ApplicationListener<ContextRefreshedEvent> {    @Autowired    private SpringProcessEngineConfiguration configuration;       @Autowired    private ProcessEndListener processEndListener;      @Override    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {        FlowableEventDispatcher dispatcher = configuration.getEventDispatcher();              dispatcher.addEventListener(processEndListener, FlowableEngineEventType.PROCESS_COMPLETED);           }}
package com.zhuanzhuan.workflow_engine.listener;import com.bj58.zhuanzhuan.zzarch.common.util.JsonUtil;import com.zhuanzhuan.workflow_engine.entity.dto.WorkflowOrderDTO;import com.zhuanzhuan.workflow_engine.enums.CurrentFlagEnum;import com.zhuanzhuan.workflow_engine.enums.WorkflowStateEnum;import com.zhuanzhuan.workflow_engine.mq.MqConstant;import com.zhuanzhuan.workflow_engine.mq.body.ProcessExchangeMsgBody;import com.zhuanzhuan.workflow_engine.mq.producer.ProducerHandler;import com.zhuanzhuan.workflow_engine.service.WorkflowOrderBizService;import com.zhuanzhuan.workflow_engine.wrapper.FlowableWrapper;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.flowable.common.engine.api.delegate.event.FlowableEvent;import org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import javax.annotation.Resource;/** * @author:Live * @desc: * @date: 19:34 2023/1/13 */@Component@Slf4jpublic class ProcessEndListener implements FlowableEventListener {    @Override    public void onEvent(FlowableEvent flowableEvent) {      // 流程结束的监听器,发送mq、给发起人发送消息在此进行    }        @Override    public boolean isFailOnException() {        // 抛异常, 不姑息        return true;    }    @Override    public boolean isFireOnTransactionLifecycleEvent() {        // event触发时机跟着 getOnTransaction走        return true;    }    @Override    public String getOnTransaction() {        // 提交事务后触发        return TransactionState.COMMITTED.name();    }}

六.总结

以上就是Flowable工作流引擎的简介以及基本用法,我们实际生产建设过程中,还需要基于框架进行拓展开发来满足我们项目的实际需要,例如是否需要引入用户组、权限管理的模块、是否存在性能问题从而引入异步任务的模块、是否需要冗余业务表来满足定制化查询的需求,这些都属于扩展玩法,需要我们根据实际需求按需接入。毕竟没有最好的架构,只有最适合的架构,选择适合自己的才是最重要的。kLj28资讯网——每日最新资讯28at.com

七.参考资料

1.flowable官方文档 https://www.flowable.org/documentation.html
2.技术选型参考 https://www.zhihu.com/question/59274016/answer/2398240513kLj28资讯网——每日最新资讯28at.com

关于作者 kLj28资讯网——每日最新资讯28at.com

王锐刚,线上回收业务后端开发工程师kLj28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-101-0.htmlFlowable工作流引擎的科普与实践

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 得物效率前端微应用推进过程与思考

下一篇: 学习JavaScript的10个理由...

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 在线图片编辑器,支持PSD解析、AI抠图等

    在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 新电商三兄弟,“抖快红”成团!

    新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 网传小米汽车开始筛选交付中心 建筑面积不低于3000平方米

    网传小米汽车开始筛选交付中心 建筑面积不低于3000平方米

    7月7日消息,近日有微博网友@长三角行健者爆料称,据经销商集团反馈,小米汽车目前已经开始了交付中心的筛选工作,要求候选场地至少有120个车位,建筑不能低
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    在今日举行的2023年华为云数字文娱AI创新峰会上,华为云全球Marketing与销售服务总裁石冀琳表示,华为云将在后续推出盘古数字人大模型,可帮助用户12小
  • 2纳米决战2025

    2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
Top