截至 2024 年 7 月 31 日, AWS SDK for Java 1.x 已進入維護模式,且將於 2025 年 12 月 31 日end-of-support
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
非同步程式設計
您可以使用同步或非同步方法來呼叫 AWS 服務上的操作。同步方法會封鎖您的執行緒執行,直到用戶端收到服務的回應。非同步方法會立即傳回,將控制權回歸給呼叫端執行緒,無需等待回應。
由於非同步方法會在有可用回應之前傳回,您需要一個方法在回應準備好時取得回應。 AWS SDK for Java 提供兩種方式:未來物件和回呼方法。
Java 未來
中的非同步方法會 AWS SDK for Java 傳回未來
呼叫 Future
isDone()
方法,查看服務是否已提供回應物件。當回應準備就緒時,您可以透過呼叫 Future
get()
方法取得回應物件。您可以使用此機制定期輪詢非同步操作的結果,同時您的應用程式會繼續處理其他項目。
以下是呼叫 Lambda 函數的非同步操作範例,接收Future
可以容納 InvokeResult 物件的 。InvokeResult
物件只會在 isDone()
為 之後擷取true
。
import com.amazonaws.services.lambda.AWSLambdaAsyncClient; import com.amazonaws.services.lambda.model.InvokeRequest; import com.amazonaws.services.lambda.model.InvokeResult; import java.nio.ByteBuffer; import java.util.concurrent.Future; import java.util.concurrent.ExecutionException; public class InvokeLambdaFunctionAsync { public static void main(String[] args) { String function_name = "HelloFunction"; String function_input = "{\"who\":\"SDK for Java\"}"; AWSLambdaAsync lambda = AWSLambdaAsyncClientBuilder.defaultClient(); InvokeRequest req = new InvokeRequest() .withFunctionName(function_name) .withPayload(ByteBuffer.wrap(function_input.getBytes())); Future<InvokeResult> future_res = lambda.invokeAsync(req); System.out.print("Waiting for future"); while (future_res.isDone() == false) { System.out.print("."); try { Thread.sleep(1000); } catch (InterruptedException e) { System.err.println("\nThread.sleep() was interrupted!"); System.exit(1); } } try { InvokeResult res = future_res.get(); if (res.getStatusCode() == 200) { System.out.println("\nLambda function returned:"); ByteBuffer response_payload = res.getPayload(); System.out.println(new String(response_payload.array())); } else { System.out.format("Received a non-OK response from {AWS}: %d\n", res.getStatusCode()); } } catch (InterruptedException | ExecutionException e) { System.err.println(e.getMessage()); System.exit(1); } System.exit(0); } }
非同步回呼
除了使用 Java Future
物件來監控非同步請求的狀態之外, 軟體開發套件還可讓您實作使用 AsyncHandler 介面的類別。 AsyncHandler
提供兩種呼叫方法,取決於請求的完成方式: onSuccess
和 onError
。
回呼界面方法的主要優點是,它讓您不必輪詢Future
物件,即可了解請求何時完成。相反地,您的程式碼可以立即開始下一個活動,並依賴軟體開發套件在正確的時間呼叫您的處理常式。
import com.amazonaws.services.lambda.AWSLambdaAsync; import com.amazonaws.services.lambda.AWSLambdaAsyncClientBuilder; import com.amazonaws.services.lambda.model.InvokeRequest; import com.amazonaws.services.lambda.model.InvokeResult; import com.amazonaws.handlers.AsyncHandler; import java.nio.ByteBuffer; import java.util.concurrent.Future; public class InvokeLambdaFunctionCallback { private class AsyncLambdaHandler implements AsyncHandler<InvokeRequest, InvokeResult> { public void onSuccess(InvokeRequest req, InvokeResult res) { System.out.println("\nLambda function returned:"); ByteBuffer response_payload = res.getPayload(); System.out.println(new String(response_payload.array())); System.exit(0); } public void onError(Exception e) { System.out.println(e.getMessage()); System.exit(1); } } public static void main(String[] args) { String function_name = "HelloFunction"; String function_input = "{\"who\":\"SDK for Java\"}"; AWSLambdaAsync lambda = AWSLambdaAsyncClientBuilder.defaultClient(); InvokeRequest req = new InvokeRequest() .withFunctionName(function_name) .withPayload(ByteBuffer.wrap(function_input.getBytes())); Future<InvokeResult> future_res = lambda.invokeAsync(req, new AsyncLambdaHandler()); System.out.print("Waiting for async callback"); while (!future_res.isDone() && !future_res.isCancelled()) { // perform some other tasks... try { Thread.sleep(1000); } catch (InterruptedException e) { System.err.println("Thread.sleep() was interrupted!"); System.exit(0); } System.out.print("."); } } }
最佳實務
回呼執行
您的 實作AsyncHandler
會在非同步用戶端擁有的執行緒集區中執行。快速執行的短程式碼最適合您的AsyncHandler
實作。處理常式方法內的長時間執行或封鎖程式碼可能會導致非同步用戶端使用的執行緒集區發生爭用,並可防止用戶端執行請求。如果您有需要從回呼開始的長期執行任務,請讓回呼在新的執行緒或由應用程式管理的執行緒集區中執行其任務。
執行緒集區組態
中的非同步用戶端 AWS SDK for Java 提供預設執行緒集區,應適用於大多數應用程式。您可以實作自訂 ExecutorService
例如,您可以提供使用自訂 ThreadFactoryExecutorService
實作,或記錄有關執行緒用量的其他資訊。
非同步存取
開發套件中的 TransferManager 類別提供使用 的非同步支援 Amazon S3。 TransferManager
管理非同步上傳和下載、提供有關傳輸的詳細進度報告,以及支援回呼至不同事件。