AWS Flow Framework基本概念:活動與工作流程之間的資料交換 - AWS Flow Framework 對於爪哇

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

AWS Flow Framework基本概念:活動與工作流程之間的資料交換

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

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

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

注意

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

Promise<T> 類型

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> 會在物件就緒時,公開傳回 trueisReady 方法。不建議使用 isReady 來輪詢 Promise<T> 物件,但在特定情況下,isReady 十分有用。如需範例,請參閱AWS Flow Framework配方

所以此AWS Flow Framework還包括一個Settable<T>類型,該類型派生於Promise<T>並具有類似的行為。區別在於,框架通常設置Promise<T>對象,而工作流程工作者會負責設定Settable<T>如需範例,請參閱AWS Flow Framework配方

有一些情況是工作流程工作者需要建立 Promise<T> 物件,並設定其值。例如,傳回 Promise<T> 物件的非同步方法需要建立傳回值。

  • 若要建立代表類型值的物件,請呼叫靜態 Promise.asPromise 方法,以建立適當類型的 Promise<T> 物件、設定其值,並讓其進入就緒狀態。

  • 若要建立 Promise<Void> 物件,請呼叫靜態 Promise.Void 方法。

注意

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

資料轉換器和封送處理

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