我有一个用于某些业务流程的 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 提出了一些降低风险的好方法,但即使将业务逻辑从集成中分离出来并将决策点外化到规则引擎中,也并不总能让您到达需要的位置。
您是添加任务和更改变量类型的示例,这些都是经典案例,如果您不分支,我们喜欢称之为“飞行中”流程的流程将在新流程模型中简单地失败。
其他经典示例是未能初始化新流程所需的变量,以及添加的决策逻辑永远无法在飞行流程中成功。
一般来说,有几种处理流程演变的方法:
让旧流程完成其原始流程并在新流程上启动新流程。显然这只适用于某些情况,但却是最简单的方法。运行时间非常长的进程往往不属于此类别。
将所有数据外部化到外部记录系统,并尽量减少流程本身中保存的数据(保留引用,而不是数据本身)。这是对 Phillipe 提出的观点的扩展。遵循此最佳实践意味着您的流程逻辑不会与数据紧密绑定(bind),而是仅与影响流程流的决策绑定(bind)。将规则和决策以及为做出这些决策而调用的服务外部化,您可以更自由地修改流程逻辑,同时减少对运行中流程的影响。
将业务逻辑添加到流程中以专门处理飞行中的问题。这是您在问题中引用的方法。它是可行的,但正如您所说,可能会成为维护的噩梦。
通过使用具有定义明确的接口(interface)的调用子流程,在您的流程中定义“安全区”或里程碑。通过这种方式,您可以以受控方式更改流程的各个部分。显然,在要替换的段内具有 token 的实例会发生什么情况?您需要随着时间的推移排除这些实例,或者提前计划并在即将部署该段的新模块时阻止流程进入子流程。
然后是上述所有组合(现实生活中往往会发生这种情况)。
没有简单的解决方案,尽管一些 BPMS 系统具有可帮助识别潜在升级问题的工具,但这仍然归结为良好的架构、规划和测试。
关于java - 将 Activiti 任务从旧流程迁移到新流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34205814/