workflow - Uber Cadence 工作流程版本控制
问题描述
Cadence 工作流程版本控制:
工作流 impl 具有以下代码:
int version1 = Workflow.getVersion("change123", Workflow.DEFAULT_VERSION, 1);
logger.info("version1: {}", version1);
工作流程 1 的开始:o/p -- version1: 1
工作流 impl 的变化:
int version1 = Workflow.getVersion("change1234", Workflow.DEFAULT_VERSION, 2);
logger.info("version1: {}", version1);
工作流程 2 的开始:o/p -- version1: 2
工作流 impl 的变化:
int version1 = Workflow.getVersion("change12345", Workflow.DEFAULT_VERSION, 3);
logger.info("version1: {}", version1);
工作流程 3 的开始:o/p -- version1: 3
重播工作流程 2 : o/p --version1: -1
重播工作流程 1 : o/p --version1: -1
我期待低于o / p
重播工作流程 2 : o/p -- version1: 2
重播工作流程 1 : o/p -- version1: 1
所以这意味着我们一次只能维护两个版本的工作流代码,
当前版本和所有旧版本 getVersion 将给出 Workflow.DEFAULT_VERSION
如果我错了,请纠正我!
解决方案
问题是您正在传递不同的changeID
要为同一部分维护不同的版本,您必须继续使用相同的 changeID,除非该 changeID 稍后被弃用但您想再次进行更改。
ChangID 是工作流中用于区分更改的不同部分的标识符。例如,您的工作流程:
String resA = activities.executeA();
String resB = activities.executeB();
如果要更改executeA=>executeAA,则变为:
int versionA = Workflow.getVersion("changeToA", Workflow.DEFAULT_VERSION, 1);
if(versionA == 1){
String resA = activities.executeAA();
}else{
String resA = activities.executeA();
}
String resB = activities.executeB();
然后稍后如果你想改变 executeAA=>executeAAA 那么它变成:
int versionA = Workflow.getVersion("changeToA", Workflow.DEFAULT_VERSION, 2);
if(versionA == 2){
String resA = activities.executeAAA();
}else if versionA == 1{
String resA = activities.executeAA();
}else{
String resA = activities.executeA();
}
String resB = activities.executeB();
这样您就可以维护多个版本。
然后如果你想改变executeB=>executeBB,那么你必须使用另一个changeID:
int versionA = Workflow.getVersion("changeToA", Workflow.DEFAULT_VERSION, 2);
if(versionA == 2){
String resA = activities.executeAAA();
}else if versionA == 1{
String resA = activities.executeAA();
}else{
String resA = activities.executeA();
}
int versionB = Workflow.getVersion("changeToB", Workflow.DEFAULT_VERSION, 1);
if(versionB == 1){
String resB = activities.executeBB();
}else{
String resB = activities.executeB();
}
这里的关键是了解 changeID,确实有点棘手,但是一旦掌握了它,它就很强大。
在您的代码中,因为您总是使用不同的changeID,所以已经启动的工作流程(工作流程 1 和工作流程 2)将始终获得 DEFAULT_VERSION(-1)。
在内部,当处于执行模式(非重播)时,getVersion 将在执行代码时将带有 MaxVersion 的 Marker 事件写入历史记录。
在重放模式下,如果 Marker 存在(changeID 必须匹配,否则标记被忽略),则从 Marker 返回版本,如果不存在(因为 workflow1 在其执行模式下没有 getVersion 代码),则使用minVersion(在您的情况下为 DEFAULT_VERSION)。(如果来自标记的版本低于 minVersion,它将返回错误)
查看更多文档:
推荐阅读
- c# - .net core 中的 Computehash 方法
- java - log4j.properties 文件未提供所需的输出
- rust - 如何修改 Nicks Pallet(在 Substrate 中)以通过将货币转移到另一个帐户来设置昵称,而不是使用储备货币?
- asp.net-core - 在 Asp.net MVC Core 中,Jquery Ajax 调用传递的参数始终为空
- javascript - 想在我的 java 脚本日历中创建一个事件。那就是向特定事件添加文本,基本上是我日历中的各个日期旁边的文本
- bash - 仅在包含的脚本中设置 -u
- java - 从 Kotlin 使用的 Java 库中的泛型和继承
- javascript - Oracle Apex 动态复制表格形式条目
- kubernetes - Istio 入口和出口网关的用途
- swift - 是否可以在 SwiftUI 的 ForEach 中迭代字典?