

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# AWS Flow Framework 基本概念：活動與工作流程之間的資料交換
<a name="awsflow-basics-data-exchange-activities-workflows"></a>

當您呼叫非同步活動用戶端方法時，會立即傳回 *Promise* (也稱為 *Future*) 物件，代表活動方法的傳回值。一開始，Promise 處於未就緒狀態，並且未定義傳回值。在活動方法完成其任務並傳回之後，框架會將傳回值跨網路封送處理至工作流程工作者，以將值指派給 Promise，並讓物件進入就緒狀態。

即使活動方法沒有傳回值，您還是可以使用 Promise 來管理工作流程執行。如果您將傳回的 Promise 傳遞給活動用戶端方法或非同步工作流程方法，將延遲執行，直到物件就緒為止。

如果您將一或多個 Promise 傳遞給活動用戶端方法，框架會將任務置入佇列，但延遲進行排程，直到所有物件都就緒為止。框架接著會擷取每個 Promise 中的資料，並將之跨網際網路封送處理至活動工作者，以將之傳遞給活動方法做為標準類型。

**注意**  
如果您需要在工作流程與活動工作者之間傳輸大量資料，較建議的方法是在便利的位置存放資料，並且只傳遞擷取資訊。例如，您可以將資料存放在 Amazon S3 儲存貯體中，並傳遞相關聯的 URL。

## Promise<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>` 會在物件就緒時，公開傳回 `true` 的 `isReady` 方法。不建議使用 `isReady` 來輪詢 `Promise<T>` 物件，但在特定情況下，`isReady` 十分有用。

 AWS Flow Framework 適用於 Java 的 也包含衍生自 `Promise<T>`且具有類似行為的 `Settable<T>`類型。差別在於架構通常會設定`Promise<T>`物件的值，而工作流程工作者負責設定 的值`Settable<T>`。

有一些情況是工作流程工作者需要建立 `Promise<T>` 物件，並設定其值。例如，傳回 `Promise<T>` 物件的非同步方法需要建立傳回值。
+ 若要建立代表類型值的物件，請呼叫靜態 `Promise.asPromise` 方法，以建立適當類型的 `Promise<T>` 物件、設定其值，並讓其進入就緒狀態。
+ 若要建立 `Promise<Void>` 物件，請呼叫靜態 `Promise.Void` 方法。

**注意**  
`Promise<T>` 可以代表任何有效的類型。不過，如果必須跨網際網路封送處理資料，則類型必須與資料轉換器相容。如需詳細資訊，請參閱下節。

## 資料轉換器和封送處理
<a name="awsflow-basics-data-exchange-activities-workflows.data"></a>

會使用資料轉換器跨網際網路 AWS Flow Framework 封送資料。框架預設會使用根據 [Jackson JSON 處理器](https://github.com/codehaus/jackson)的資料轉換器。不過，此轉換器有一些限制。例如無法封送處理未使用字串做為索引鍵的對應。如果預設轉換器不適用您的應用程式，則您可以實作自訂資料轉換器。如需詳細資訊，請參閱[DataConverters](dataconverters.md)。