0

我发现getVersion API有点难以掌握。在对工作流程更改进行了一些手动实验后,我发现拥有这样一段代码非常好:

val version = Workflow.getVersion("change#1", 1, 1);
val anotherVersion = Workflow.getVersion("change#2", 2, 2);
  1. 这是否意味着整数版本被分配给一个changeId而不是工作流实例?单个工作流实例/执行是否保留一组基于整数的版本?

  2. 目的minSupportedmaxSupported参数是什么?为什么干脆不使用像下面这样的 API?

val version = Workflow.getVersion("change#1")
if (version) {
   // code after "change#1" changes
} else {
   // code before "#change#1" changes
}
4

1 回答 1

0
  1. 你是对的,版本分配给一个changeId不是工作流实例。这允许独立地对工作流代码的每个部分进行版本控制。它允许在工作流已经运行并且没有到达代码的那部分时修复错误。
  2. 主要原因是验证。首次执行代码时工作流历史记录中的getVersion调用记录。maxVersion因此,在重放时,即使版本发生了maxVersion变化,也会使用正确的版本来保证正确的重放。当一个分支被删除时,minVersion它会增加。想象一下,当存在需要删除分支的工作流时,错误地部署了此类代码。getVersion它将检测到minVersion大于历史记录中记录的值,并且将使决策任务失败,本质上是阻止工作流执行而不是破坏它。如果录制的版本高于maxVersion参数,也会发生同样的情况。

更新:回复评论

换句话说,我试图提出一种情况,即使用许多不同的 changeIds 并且不超过 maxVersion=1 是不够的

如果您不执行删除分支,它们就足够了。但是如果你这样做了,那么验证最小版本是非常方便的。例如看下面的代码:

val version = Workflow.getVersion("change", 0, 2);
if (version == DEFAULT_VERSION) {
   // before change
} else if (version == 1) {
   // first change
} else { 
   // second hange
}

让我们删除默认版本:

val version = Workflow.getVersion("change", 1, 2);
if (version == 1) {
   // first change
} else { 
   // second hange
}

现在看看没有最小值和最大值的版本:

var version1 = Workflow.getVersion("change1");
var version2 = Workflow.getVersion("change2");
if (version1 == DEFAULT_VERSION) {
   // before change
} else if (version2 == DEFAULT_VERSION) {
   // first change
} else { 
   // second hange
}

让我们删除默认分支:

var version2 = Workflow.getVersion("change2");
if (version2 == DEFAULT_VERSION) {
   // first change
} else { 
   // second hange
}

请注意,如果使用最后一个示例代码的工作流被错误地路由到不知道版本 2,而只知道原始默认版本的工作人员,它将以不可预知的方式中断。第一个带有 min max version 的示例将优雅地检测问题。

于 2020-02-13T19:54:13.137 回答