

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS Flow Framework 适用于 Java 重播行为
<a name="programming-replay"></a>

本主题使用[Java 的 AWS Flow Framework 用法是什么？](welcome.md)一节中的示例讨论重播行为的示例。同时讨论了[同步](#programming-replay-synchronous)和[异步](#programming-replay-asynchronous)情形。

## 示例 1：同步重播
<a name="programming-replay-synchronous"></a>

有关同步工作流中重播的工作原理的示例，请通过在各自的实现中添加`println`调用来修改[HelloWorldWorkflow](getting-started-example-helloworldworkflow.md)工作流程和活动实现，如下所示：

```
public class GreeterWorkflowImpl implements GreeterWorkflow {
...
   public void greet() {
      System.out.println("greet executes");
      Promise<String> name = operations.getName();
      System.out.println("client.getName returns");
      Promise<String> greeting = operations.getGreeting(name);
      System.out.println("client.greeting returns");
      operations.say(greeting);
      System.out.println("client.say returns");
   }
}
**************
public class GreeterActivitiesImpl implements GreeterActivities {
   public String getName() {
      System.out.println("activity.getName completes");
      return "World";
   }

   public String getGreeting(String name) {
      System.out.println("activity.getGreeting completes");
      return "Hello " + name + "!";
   }

   public void say(String what) {
      System.out.println(what);
   }
}
```

有关代码的详细信息，请参阅 [HelloWorldWorkflow 应用程序](getting-started-example-helloworldworkflow.md)。以下是输出的已编辑版本，使用注释来指示每个重播阶段的开始。

```
//Episode 1
greet executes
client.getName returns
client.greeting returns
client.say returns

activity.getName completes
//Episode 2
greet executes
client.getName returns
client.greeting returns
client.say returns

activity.getGreeting completes
//Episode 3
greet executes
client.getName returns
client.greeting returns
client.say returns

Hello World! //say completes
//Episode 4
greet executes
client.getName returns
client.greeting returns
client.say returns
```

此示例的重播过程的工作方式如下：
+ 第一个阶段安排 `getName` 活动任务，它没有任何依赖项。
+ 第二个阶段安排 `getGreeting` 活动任务，它依赖 `getName`。
+ 第三个阶段安排 `say` 活动任务，它依赖 `getGreeting`。
+ 最后一个阶段没有安排任何其他任务并且没有发现任何未完成的活动，它终止工作流执行。

**注意**  
为每个阶段调用一次这三个活动客户端方法。但是，只有其中一个调用活动任务中的结果，因此每个任务只执行一次。

## 示例 2：异步重播
<a name="programming-replay-asynchronous"></a>

与[同步重播示例](#programming-replay-synchronous)类似，您可以修改 [HelloWorldWorkflowAsync 应用程序](getting-started-example-helloworldworkflowasync.md)来了解异步重播的工作方式。它生成以下输出：

```
//Episode 1
greet executes
client.name returns
workflow.getGreeting returns
client.say returns

activity.getName completes
//Episode 2
greet executes
client.name returns
workflow.getGreeting returns
client.say returns
workflow.getGreeting completes

Hello World! //say completes
//Episode 3
greet executes
client.name returns
workflow.getGreeting returns
client.say returns
workflow.getGreeting completes
```

HelloWorldAsync 使用三个重播剧集，因为只有两个活动。`getGreeting` 活动被替换为 *getGreeting* 异步工作流方法，该方法在完成时不启动重播阶段。

第一个阶段没有调用 `getGreeting`，因为它依赖 *name* 活动的完成。但是，在 *getName* 完成之后，重播将为每个后续阶段调用一次 *getGreeting*。

## 另请参阅
<a name="see-also"></a>
+ [AWS Flow Framework 基本概念：分布式执行](awsflow-basics-distributed-execution.md)