问题描述
历史回放如何按节奏工作?
比如说,第一个活动完成了,第二个活动有 100 行代码。如果在activity2中执行第50行代码时app server重启,是不是正好从第50行开始执行。如果是,那么节奏中发生了什么神奇的事情?
@Override
public String composeGreeting(String greeting,String name) throws Exception {
FileWriter fw =
new FileWriter(
"/Users/kumble-004/Documents/Uber_Cadence/Sample_Projects/TestCadence/src/com/company/"+name+".txt");
System.out.println(
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").format(LocalDateTime.Now())
+ " [Activity] started");
long time = System.currentTimeMillis() + 240000;
int i = 0,j=1;
while (System.currentTimeMillis() != time) {
if(i++ %10000000 == 0) {
fw.write("print - " + j++ + " " +
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").format(LocalDateTime.Now()) +"\n");
}
}
fw.close();
System.out.println(
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").format(LocalDateTime.Now())
+ " [Activity] ended");
return greeting + " " + name + "!";
}
}
我的 hello 活动中有上述代码。此代码将运行 4 分钟,并在满足条件时将数据写入文件
我启动了一个工作流程,并在打印 [Activity] started
后退出了 cadence 服务器。我没有开始它只是停止它。但是 4 分钟后,它在控制台中准确地打印了 [Activity] Ended
。我想知道这怎么可能,因为我停止了服务器但代码正在执行,数据正在写入文件中。
当我通过 cadence UI 检查它时,它显示最后的历史记录是
ActivityTaskStarted
。然后我启动了我的服务器。 15 分钟后(因为 scheduletoCloseTimeoutSeconds 是 15 分钟)活动返回,事件 ActivityTasktimedOut
和整个 whorkflow 由于此超时而失败。
请解释一下重新启动cadence服务器时发生了什么?
解决方法
如果应用服务器在activity2中执行第50行代码时重启,是否正好从第50行开始执行
不,它不会为您从第 50 行活动自动恢复。
重放只发生在工作流中。它依靠 History 来重放和重建内存堆栈。工作流中发生的一切都存储在历史记录中:
- 工作流代码中的每一步,都会生成一堆名为“决策”的结果
- Activity/ChildWorkflow 结果
- 外部事件,如信号
- 计时器
- 等
详情请参考the doc about replay history和What exactly is a Cadence decision task?
但 4 分钟后,它在控制台中准确打印了 [Activity] Ended。我想知道这怎么可能,因为我停止了服务器但代码正在执行,数据正在写入文件中。
那是因为您的活动工作器仍在运行。您正在运行的代码纯粹是活动代码。
但是,当服务器关闭时,它的活动结果将无法报告给服务器。这意味着历史将丢失它,并且工作流可能会重新安排另一个活动(如果启用了重试)。