java - 将 Activiti 任务从旧流程迁移到新流程

标签 java workflow activiti business-process-management bpmn

我有一个用于某些业务流程的 Activiti 项目。

问题是关于迁移的。现有流程有一些未完成的任务。我想通过添加新步骤来修改现有流程。

现在,当我创建一个新任务时,这个新任务将根据更新后的流程进行处理。未完成的任务将按旧流程处理。

让我们来看下面的例子:https://spring.io/blog/2015/03/08/getting-started-with-activiti-and-spring-boot

在此示例中,请考虑以下行:

taskVariables.put("telephoneInterviewOutcome", true);

假设我有一些业务逻辑代码,我在其中检查此变量的值,例如:

if (taskVariables.get("telephoneInterviewOutcome") == true) {...}

现在假设,我想将此变量从 Boolean 修改为 Enum。现在,我还需要更新我的业务逻辑:

if (taskVariables.get("telephoneInterviewOutcome") == SOMEENUM) {...}

现在,我的业务逻辑代码需要根据手头任务的流程版本进行分支。如果任务属于流程的版本 1,那么我将使用第一个语句,否则使用第二个语句:

if (getProcessVersion(task) == 1) {
    if (taskVariables.get("telephoneInterviewOutcome") == true) {...}
} else {
    if (taskVariables.get("telephoneInterviewOutcome") == SOMEENUM) {...}
}

这种方法的问题是业务逻辑代码会随着流程的更新而增长。这会在生产过程中引起很多错误。

这个问题还有其他解决办法吗?如何在不更改业务逻辑代码的情况下解决这个问题?

最佳答案

您所描述的是任何长期运行的流程实现的主要痛点之一。我实现的许多流程都存在超过 12 个月,因此您始终必须考虑流程模型的演变。

Philippe 提出了一些降低风险的好方法,但即使将业务逻辑从集成中分离出来并将决策点外化到规则引擎中,也并不总能让您到达需要的位置。

您是添加任务和更改变量类型的示例,这些都是经典案例,如果您不分支,我们喜欢称之为“飞行中”流程的流程将在新流程模型中简单地失败。

其他经典示例是未能初始化新流程所需的变量,以及添加的决策逻辑永远无法在飞行流程中成功。

一般来说,有几种处理流程演变的方法:

  1. 让旧流程完成其原始流程并在新流程上启动新流程。显然这只适用于某些情况,但却是最简单的方法。运行时间非常长的进程往往不属于此类别。

  2. 将所有数据外部化到外部记录系统,并尽量减少流程本身中保存的数据(保留引用,而不是数据本身)。这是对 Phillipe 提出的观点的扩展。遵循此最佳实践意味着您的流程逻辑不会与数据紧密绑定(bind),而是仅与影响流程流的决策绑定(bind)。将规则和决策以及为做出这些决策而调用的服务外部化,您可以更自由地修改流程逻辑,同时减少对运行中流程的影响。

  3. 将业务逻辑添加到流程中以专门处理飞行中的问题。这是您在问题中引用的方法。它是可行的,但正如您所说,可能会成为维护的噩梦。

  4. 通过使用具有定义明确的接口(interface)的调用子流程,在您的流程中定义“安全区”或里程碑。通过这种方式,您可以以受控方式更改流程的各个部分。显然,在要替换的段内具有 token 的实例会发生什么情况?您需要随着时间的推移排除这些实例,或者提前计划并在即将部署该段的新模块时阻止流程进入子流程。

然后是上述所有组合(现实生活中往往会发生这种情况)。

没有简单的解决方案,尽管一些 BPMS 系统具有可帮助识别潜在升级问题的工具,但这仍然归结为良好的架构、规划和测试。

关于java - 将 Activiti 任务从旧流程迁移到新流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34205814/

相关文章:

activiti - 如何获取有关当前部署流程的信息以在 Activiti 中显示自定义流程图

spring-boot - Activiti Spring Boot 强 UUID

java - Spring 状态机的替代品

java - JUnit - 测试方法是否被调用

java - Hibernate刷新不会为陈旧对象抛出StalestateException(除了第一次刷新调用)

java - 使用 Java 的 IBM PCOMM 自动化

java - MOXy 解码不容忍 dateTime 之前的空格

git - 如何跨文件夹或存储库共享文件

workflow - 开发团队通过 Google Wave 进行协作

c# - 如何使用 powershell/c# 列出 SharePoint 中的所有 2013 工作流程