如何解决历史回放如何按节奏进行?
历史回放如何按节奏工作?
我有一个按顺序调用两个活动的工作流。
比如说,第一个活动完成了,第二个活动有 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。我想知道这怎么可能,因为我停止了服务器但代码正在执行,数据正在写入文件中。
那是因为您的活动工作器仍在运行。您正在运行的代码纯粹是活动代码。
但是,当服务器关闭时,它的活动结果将无法报告给服务器。这意味着历史将丢失它,并且工作流可能会重新安排另一个活动(如果启用了重试)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。