主页传送门:📀 传送
概述
作为一个业务流程管理(BPM)工具,Flowable 一直以高效、灵活、易用等特点受到广大用户的青睐。而最近发布的 Flowable 7.0 版本,则进一步优化了其功能和性能,为用户带来更加出色的使用体验。本文将介绍 Flowable 7.0 版本的几个新特性。
总览
首先来看下Flowable 7.0 的必备环境要求及修改部分
- 这是7.0的第一个稳定版本,专注于Spring Boot 3、Spring 6 和 Java 17 升级。
- REST 应用程序需要支持 Jakarta 9 的 servlet 容器/应用程序服务器。
- 重点介绍 BPMN、CMMN、DMN 和事件注册表引擎的主要 Flowable 引擎和 REST API。这意味着没有 UI 应用程序,没有内容和表单引擎,并且删除了 Mule 和其他一些模块。
改动
- 支持CMMN的批量迁移
- 对案例重新激活的重复支持
- 支持停止内务处理批处理
- 支持 http 任务的 HTTP HEAD 和 OPTIONS
- 删除重新定位的 Spring Boot Starters
- flowable-spring-boot-starter-basic - 应改用 flowable-spring-boot-starter-process
- flowable-spring-boot-starter-rest-api - 应改用 flowable-spring-boot-starter-process-rest
- 添加包含所有 Flowable 工件的 flowable-bom
- 支持动态 Kafka 消息密钥
- 将 TaskCompletionBuilder 添加到 CmmnTaskService
- 添加对处理错误开始和边界事件的自定义输入参数以及在错误结束事件中传递其他数据的支持
- 添加在变量中存储人工和用户任务完成器的功能
- 支持在邮件任务中收集字符串或json数组作为邮件收件人
- 升级到 Spring Boot 3.1
- 升级到 Camel 4
- 升级到 CXF 4
- 提供通过 FlowableMailClient 发送电子邮件的抽象
- 使用 Jakarta Mail 而不是 Javax Mail,并将 Apache Commons Email 替换为 Eclipse Angus Mail
- 删除基于消息的执行程序
- 删除一些 Flowable 已弃用的代码
- CmmnRepositoryService#getDecisionTablesForCaseDefinition 改用CmmnRepositoryService#getDecisionsForCaseDefinition
- RepositoryService#getDecisionTablesForProcessDefinition 改用 RepositoryService#getDecisionsForProcessDefinition
- HistoricCaseInstanceQuery#limitCaseVariables 没有替代品,这是一个空操作
- CaseInstanceQuery#limitCaseInstanceVariables - 没有替代品,这是一个空操作
- HistoricProcessInstanceQuery#limitProcessInstanceVariables - 没有替代品,这是一个noop
- ProcessInstanceQuery#limitProcessInstanceVariables - 没有替代品,这是一个noop
- TaskInfoQuery#limitTaskVariables - 没有替代品,这是一个noop
- 从 CmmnEngineConfiguration 和 ProcessEngineConfigurationImpl 中删除了查询限制配置
- 删除了 HistoryManager#recordActivityEnd - 没有替换,Flowable 从未调用该方法
- 删除了 org.flowable.engine.FlowableTaskAlreadyClaimedException - 改用 org.flowable.common.engine.api.FlowableTaskAlreadyClaimedException
- 删除了 org.flowable.engine.cfg MailServerInfo - 改用 org.flowable.common.engine.impl.cfg.MailServerInfo
- 删除了 org.flowable.http.HttpRequest - 改用 org.flowable.http.common.api.HttpRequest
- 删除了 org.flowable.http.HttpResponse - 改用 org.flowable.http.common.api.HttpResponse
- 删除了 org.flowable.http.delegate.HttpRequestHandler - 改用 org.flowable.http.common.api.delegate.HttpRequest
- 删除了 org.flowable.http.delegate.HttpResponseHandler - 改用 org.flowable.http.common.api.delegate.HttpResponse
- 删除了 org.flowable.identitylink.service.IdentityLinkType - 改用 org.flowable.identitylink.api.IdentityLinkType
- 删除了 ManagedAsyncJobExecutor - 在引擎配置中配置线程工厂
- 删除了org.flowable.spring.SpringCallerRunsRejectedJobsHandler - 改用org.flowable.spring.job.service.SpringCallerRunsRejectedJobsHandler
- 删除了 org.flowable.spring.SpringRejectedJobsHandler - 改用 org.flowable.spring.job.service.SpringRejectedJobsHandler
- 删除异步历史记录支持。如果您使用的是异步历史记录,请确保在启动新版本之前没有异步历史记录作业
主要更改
涉及删除异步历史记录支持。在版本 6 中,用户可以将历史数据存储为与运行时数据相同的事务的一部分(这是现在版本 7 中的唯一选项),也可以仅将运行时数据存储,然后将历史数据存储在异步作业中,以便在异步执行器最早方便时进行处理。后一种方法有一个很大的缺点,特别是在高并发的情况下,历史数据的存储顺序与运行时数据的顺序相同。因此,Flowable 7 将在同一事务中存储运行时和历史数据(如果历史级别设置为高于无级别)。
排除 Flowable UI 应用程序。 虽然任务和管理应用程序通常被称为示例应用程序,但 Flowable Modeler 是对案例、流程和其他模型类型进行建模的重要工具。如您所知,Flowable UI 应用程序使用不受支持的 AngularJS 和 Oryx 版本,并且已经过时了很长时间。因此,Flowable 决定构建一种新的设计工具,具有全新的用户体验来设计 CMMN 和 BPMN 应用程序。新版本是使用 ( React 和 ReactFlow ) 实现的,并且已在 design 上免费提供。可以通过 链接 轻松注册一个帐户。
完全关注 CMMN、BPMN 和 DMN 引擎,并从版本 7 中删除表单和内容引擎。 值得注意的是,在版本 6 中,表单和内容引擎的功能很少。
DMN 支持
DMN(决策模型和表示法)是一种用于描述业务规则的标准语言,它允许用户以一种形式化的方式定义业务规则并进行自动化决策。在 Flowable 7.0 版本中,DMN 得到了更好的支持。现在,Flowable 的用户可以使用 DMN 编辑器来创建和管理决策规则,并将其集成到流程中。此外,Flowable 还提供了一些新的 DMN 函数,使用户可以更方便地访问流程数据和变量。
IELE 任务引擎
IELE(内部执行事件监听器引擎)是 Flowable 的一项新功能,它允许用户在运行时动态地监听和处理任务事件。通过 IELE,用户可以快速构建自定义的任务监听器,并在任务发生指定事件时自动触发相应的操作。例如,当一个任务被分配给某个用户时,用户可以通过 IELE 自动接收到通知并开始处理该任务。
CAMunda Cloud API
Camunda Cloud 是一个基于云端的 BPM 平台,它提供了一套完整的 BPM 工具和服务,包括流程设计、任务管理、历史记录查询等功能。在 Flowable 7.0 版本中,Camunda Cloud API 得到了进一步的完善和增强。现在,用户可以使用 Camunda Cloud API 来管理和操作云端上的流程实例、任务等信息,从而实现与云端平台的无缝集成。
表单设计器增强
Flowable 的表单设计器是一个强大的工具,它允许用户通过可视化的方式来设计和配置表单。在 Flowable 7.0 版本中,表单设计器得到了一些新的增强功能。例如,用户可以使用新的控件来显示和编辑日期和时间字段;可以使用条件语句来控制表单的显示和行为;还可以使用样式表来自定义表单的外观和布局等。这些增强功能使得表单设计器更加灵活和易于使用。
@Override
protected void writePlanItemDefinitionSpecificAttributes(Stage stage, XMLStreamWriter xtw) throws Exception {
super.writePlanItemDefinitionSpecificAttributes(stage, xtw);
if (StringUtils.isNotEmpty(stage.getFormKey())) {
xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_FORM_KEY, stage.getFormKey());
}
if (!stage.isSameDeployment()) {
// default is true
xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_SAME_DEPLOYMENT, "false");
}
if (StringUtils.isNotEmpty(stage.getValidateFormFields())) {
xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_FORM_FIELD_VALIDATION, stage.getValidateFormFields());
}
if (stage.isAutoComplete()) {
xtw.writeAttribute(ATTRIBUTE_IS_AUTO_COMPLETE, Boolean.toString(stage.isAutoComplete()));
}
if (StringUtils.isNotEmpty(stage.getAutoCompleteCondition())) {
xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_AUTO_COMPLETE_CONDITION, stage.getAutoCompleteCondition());
}
if (stage.getDisplayOrder() != null) {
xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_DISPLAY_ORDER, String.valueOf(stage.getDisplayOrder()));
}
if (StringUtils.isNotEmpty(stage.getIncludeInStageOverview()) && !"true".equalsIgnoreCase(stage.getIncludeInStageOverview())) { // if it's missing, it's true by default
xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_INCLUDE_IN_STAGE_OVERVIEW, stage.getIncludeInStageOverview());
}
}
参考资料:
如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论 你的支持就是我✍️创作的动力! 💞💞💞