

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

# AWS Flow Framework 基本概念：活动和工作流之间的数据交换
<a name="awsflow-basics-data-exchange-activities-workflows"></a>

在您调用异步活动客户端方法时，它会立即返回 *Promise* (又称为 *Future*) 对象，这表示活动方法的返回值。最初，Promise 处于未就绪状态，并且未定义返回值。在活动方法完成其任务并返回后，框架跨网络将返回值封送给工作流工作线程，后者为 Promise 分配一个值并将对象置于就绪状态。

即使活动方法没有返回值，您仍可以使用 Promise 来管理工作流执行。如果您将返回的 Promise 传递给活动客户端方法或异步工作流方法，则会推迟执行，直至对象准备就绪。

如果您将一个或多个 Promise 传递给活动客户端方法，则框架会使任务排队，但推迟安排它，直到所有对象都准备就绪。然后，它从每个 Promise 提取数据并跨 Internet 将其封送给活动工作线程，后者将其作为标准类型传递给活动方法。

**注意**  
如果您需要在工作流与活动工作线程之间传输大量数据，首选方法是将数据存储在方便的位置，然后仅传递检索信息。例如，您可以将数据存储在 Amazon S3 存储桶中并传递关联的 URL。

## 承诺 <T> 类型
<a name="awsflow-basics-data-exchange-activities-workflows.promise"></a>

`Promise<T>` 类型在一些方面与 Java `Future<T>` 类型非常类似。这两种类型都表示异步方法返回的值，并且最初都未定义。您通过调用它的 `get` 方法来访问对象的值。除此之外，这两种类型的行为截然不同。
+ `Future<T>` 是一个异步构造，它允许应用程序等待异步方法完成。如果您调用 `get`，但对象未准备就绪，则它会阻止，直到对象已准备就绪。
+ 对于 `Promise<T>`，同步由框架处理。如果您调用 `get`，但对象未准备就绪，则 `get` 会引发异常。

`Promise<T>` 的主要用途是管理从一个活动到另一个活动的数据流。它确保直到输入数据都有效后才执行活动。在许多情况下，工作流工作线程无需直接访问 `Promise<T>` 对象；它们只需将对象从一个活动传递给另一个活动，然后让框架和活动工作线程处理详细信息。要在工作流工作线程中访问 `Promise<T>` 对象的值，您必须在调用其 `get` 方法之前确定对象已准备就绪。
+ 首选方法是将 `Promise<T>` 对象传递给异步工作流方法并在那里处理值。异步方法将推迟执行，直到其所有输入 `Promise<T>` 对象都已准备就绪，这保证您可以安全地访问它们的值。
+ `Promise<T>` 公开 `isReady` 方法，如果对象已准备就绪，则该方法会返回 `true`。不建议使用 `isReady` 来轮询 `Promise<T>` 对象，但 `isReady` 在某些情况下非常有用。

f AWS Flow Framework or Java 还包括一个`Settable<T>`类型，该类型派生自`Promise<T>`并具有相似的行为。不同之处在于，框架通常设置`Promise<T>`对象的值，而工作流程工作人员负责设置对象的值`Settable<T>`。

在一些情况下，工作流工作线程需要创建 `Promise<T>` 对象并设置其值。例如，返回 `Promise<T>` 对象的异步方法需要创建返回值。
+ 要创建表示类型化值的对象，请调用静态 `Promise.asPromise` 方法，该方法创建适当类型的 `Promise<T>` 对象，设置其值，然后将其置于就绪状态。
+ 要创建 `Promise<Void>` 对象，请调用静态 `Promise.Void` 方法。

**注意**  
`Promise<T>` 可以表示任何有效类型。但是，如果必须跨 Internet 封送数据，则类型必须与数据转换器兼容。有关详细信息，请参阅下一节。

## 数据转换器和封送
<a name="awsflow-basics-data-exchange-activities-workflows.data"></a>

使用 AWS Flow Framework 数据转换器整理互联网上的数据。默认情况下，框架使用基于 [Jackson JSON 处理器](https://github.com/codehaus/jackson)的数据转换器。但是，此转换器具有一些限制。例如，它无法封送不使用字符串作为键的映射。如果默认转换器对您的应用程序来说不合适，您可以实现自定义数据转换器。有关详细信息，请参阅[DataConverters](dataconverters.md)。