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

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

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

一.引言

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

  1. 开发成本的挑战:

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

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

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

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

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

二.技术选型

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

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

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

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

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

三.Flowable引擎介绍

3.1 基础元素

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

在Flowable中,流程定义通常使用BPMN 2.0标准(Business Process Model and Notation)进行建模,可以通过Flowable Modeler进行图形化设计。G5728资讯网——每日最新资讯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支持多种类型的监听器,开发者可以根据需求自定义监听逻辑。

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

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

3.2 API说明

在调用开始之前,我们简单说明一下各个api的作用以及应用场景:G5728资讯网——每日最新资讯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系统数据表介绍

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

四.流程图建模绘制

4.1 BPMN 2.0协议

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

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

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

它具有以下特点和优势:G5728资讯网——每日最新资讯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来绘制。G5728资讯网——每日最新资讯28at.com

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

java -jar flowable-ui.war

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

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

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

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

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

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

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

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

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

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

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

接下来我会从导入到执行来执行执行一遍该流程。G5728资讯网——每日最新资讯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提供了便携的事件监听器,不需要我们额外编写代码来判断是否到达相应的节点,我们这里常用的就是节点创建、节点完成、流程结束等。G5728资讯网——每日最新资讯28at.com

Flowable支持的事件有几十种,具体大家请自行去官网参考,下面仅展示“流程结束事件”监听器的代码用例:G5728资讯网——每日最新资讯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工作流引擎的简介以及基本用法,我们实际生产建设过程中,还需要基于框架进行拓展开发来满足我们项目的实际需要,例如是否需要引入用户组、权限管理的模块、是否存在性能问题从而引入异步任务的模块、是否需要冗余业务表来满足定制化查询的需求,这些都属于扩展玩法,需要我们根据实际需求按需接入。毕竟没有最好的架构,只有最适合的架构,选择适合自己的才是最重要的。G5728资讯网——每日最新资讯28at.com

七.参考资料

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • CSS单标签实现转转logo

    CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 一年经验在二线城市面试后端的经验分享

    一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • JavaScript学习 -AES加密算法

    JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 慕岩炮轰抖音,百合网今何在?

    慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
  • 三翼鸟智能家居亮相电博会,让用户体验更真实

    三翼鸟智能家居亮相电博会,让用户体验更真实

    2021电博会在青岛国际会展中心开幕中,三翼鸟直接把“家”搬到了现场,成为了展会的一大看点。这也是三翼鸟继9月9日发布了行业首个一站式定制智慧家平台后的
Top
Baidu
map