0

历史回放如何以节奏进行?

我有一个按顺序调用两个活动的工作流。

比如说,第一个活动已经完成,第二个活动有 100 行代码。如果应用服务器在执行activity2中的第50行代码时重新启动,它是否正好从第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 分钟,当条件满足时,它将在文件中写入数据

我开始了一个工作流程,并在打印后退出了 cadence 服务器[Activity] started。我没有启动它只是停止它。但 4 分钟后,它完全[Activity] Ended在控制台中打印。我想知道这怎么可能,因为我停止了服务器但代码正在执行,数据正在写入文件中。

当我通过 cadence UI 检查它时,它显示最后的历史是 ActivityTaskStarted. 我启动了我的服务器。15 分钟后(因为 scheduleToCloseTimeoutSeconds 是 15 分钟)活动返回事件ActivityTaskTimedOut,并且整个 whorkflow 由于此超时而失败。

请解释重新启动 cadence 服务器时发生了什么?

4

1 回答 1

0

如果在activity2中执行第50行代码时app server重启了,是不是正好从第50行开始执行

不,它不会自动为您从第 50 行活动恢复。

重播只发生在工作流中。它正在中继历史以重播和重建内存堆栈。工作流中发生的一切都存储在历史记录中:

  • 工作流代码中的每一步,都会生成一堆结果,称为“决策”
  • 活动/子工作流结果
  • 信号等外部事件
  • 计时器
  • 等等。

有关详细信息,请参阅有关回放历史的文档Cadence 决策任务到底是什么?

但 4 分钟后,它正在控制台中准确打印 [Activity] Ended。我想知道这怎么可能,因为我停止了服务器但代码正在执行,数据正在写入文件中。

那是因为您的活动工作者仍在运行。您正在运行的代码纯粹是活动代码。

但是,当服务器关闭时,它的活动结果将无法报告给服务器。这意味着历史记录将丢失,并且工作流可能会重新安排另一个活动(如果启用了重试)。

请参阅有关活动超时和重试的文档

于 2021-05-17T17:20:29.870 回答