我有一个用于某些业务流程的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提出了一些降低风险的好的技术,但是即使将业务逻辑与集成分离并将决策点外部化到规则引擎,也不一定能使您始终如一。
您以添加任务和更改变量类型为例,这是经典情况,如果您不分支,我们所谓的“运行中”流程将在新流程模型中完全失败。
其他经典示例包括未能初始化新流程所需的变量,以及添加了决策逻辑,该逻辑对于飞行中的流程永远无法成功。
通常,有几种方法可以处理流程:
然后是以上所有内容的组合(这在现实生活中往往会发生)。
没有简单的解决方案,尽管某些BPMS系统具有可帮助识别潜在升级问题的工具,但仍然取决于良好的体系结构,计划和测试。