本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 AWS SDK for Java 2.x
完成設定 SDK中的步驟後,您就可以向 Amazon S3、DynamoDBIAM、Amazon EC2等 AWS 服務提出請求。
使用服務用戶端
建立服務用戶端
若要向 提出請求 AWS 服務,您必須先使用靜態工廠方法 來實例化服務用戶端builder()
。此builder()
方法會傳回可讓您自訂服務用戶端的builder
物件。Fluent setter 方法會傳回 builder
物件,讓您可以鏈結方法呼叫以提供更多便利性和更易讀的程式碼。設定所需的屬性後,請呼叫 build()
方法來建立用戶端。
例如,下列程式碼片段會將Ec2Client
物件作為 Amazon 的服務用戶端進行實例化EC2。
Region region = Region.US_WEST_2; Ec2Client ec2Client = Ec2Client.builder() .region(region) .build();
注意
中的服務用戶端SDK具有執行緒安全性。為求最佳效能,請將它們視為長期執行的物件。每個用戶端都有自己的連線集區資源,在用戶端回收記憶體時釋出。
服務用戶端物件是不可變的,因此您必須為向其提出請求的每個服務建立新的用戶端,或者如果您想要使用不同的組態來對相同的服務提出請求。
並非所有 AWS 服務都需要在服務用戶端建置器Region
中指定 ;不過,最佳實務是設定您在應用程式中進行API呼叫的區域。如需詳細資訊,請參閱AWS 區域選取。
預設用戶端組態
用戶端建置器有另一個原廠方法,名為 create()
。這個方法會使用預設組態來建立服務用戶端。它使用預設提供者鏈來載入憑證和 AWS 區域。如果無法從應用程式正在執行的環境判斷憑證或區域,呼叫 會create
失敗。請參閱使用憑證和區域選擇,以取得 如何SDK決定要使用之憑證和區域的詳細資訊。
例如,下列程式碼程式碼片段會將DynamoDbClient
物件作為 Amazon DynamoDB 的服務用戶端來實例化:
DynamoDbClient dynamoDbClient = DynamoDbClient.create();
設定服務用戶端
若要自訂服務用戶端的組態,請在builder()
工廠方法上使用設定器。為了方便起見並建立更易讀的程式碼,請鏈結方法來設定多個組態選項。
下列範例顯示已S3Client
設定數個自訂設定的 。
ClientOverrideConfiguration clientOverrideConfiguration = ClientOverrideConfiguration.builder() .apiCallAttemptTimeout(Duration.ofSeconds(1)) .retryPolicy(RetryPolicy.builder().numRetries(10).build()) .addMetricPublisher(CloudWatchMetricPublisher.create()) .build(); Region region = Region.US_WEST_2; S3Client s3Client = S3Client.builder() .region(region) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .overrideConfiguration(clientOverrideConfiguration) .httpClientBuilder(ApacheHttpClient.builder() .proxyConfiguration(proxyConfig.build(ProxyConfiguration.builder())) .build()) .build();
關閉服務用戶端
作為最佳實務,您應該在應用程式生命週期內使用服務用戶端進行多次API服務呼叫。不過,如果您需要服務用戶端供一次性使用,或不再需要服務用戶端,請將其關閉。
當不再需要服務用戶端來釋放資源時,請呼叫 close()
方法。
ec2Client.close();
如果您需要服務用戶端供一次性使用,您可以將服務用戶端作為 資源try
陳述式中的資源進行實例化。服務用戶端實作 Autoclosable
介面,因此 會在陳述式結尾JDK自動呼叫 close()
方法。
下列範例示範如何將服務用戶端用於一次性呼叫。呼叫 StsClient
的 會在傳回帳戶 ID 後 AWS Security Token Service 關閉。
import software.amazon.awssdk.services.sts.StsClient; String getAccountID() { try (StsClient stsClient = StsClient.create()) { return stsClient.getCallerIdentity().account(); } }
提出請求
使用 服務用戶端向對應的 提出請求 AWS 服務。
例如,此程式碼片段示範如何建立RunInstancesRequest
物件以建立新的 Amazon EC2執行個體:
// Create the request by using the fluid setter methods of the request builder. RunInstancesRequest runInstancesRequest = RunInstancesRequest.builder() .imageId(amiId) .instanceType(InstanceType.T1_MICRO) .maxCount(1) .minCount(1) .build(); // Use the configured request with the service client. RunInstancesResponse response = ec2Client.runInstances(runInstancesRequest);
SDK 提供流暢API的 來建立請求,而不是建立請求並在執行個體中傳遞。透過流暢,API您可以使用 Java lambda 表達式來建立請求 'in-line'。
下列範例會使用runInstances
使用建置器
// Create the request by using a lambda expression. RunInstancesResponse response = ec2.runInstances(r -> r .imageId(amiId) .instanceType(InstanceType.T1_MICRO) .maxCount(1) .minCount(1));
使用請求覆寫用戶端組態
雖然服務用戶端是不可變的,但您可以在請求層級覆寫其許多設定。當您建置請求時,您可以提供AwsRequestOverrideConfiguration
-
apiCallAttemptTimeout
-
apiCallTimeout
-
credentialProvider
-
compressionConfiguration
-
putHeader
如需使用 請求覆寫用戶端設定的範例,假設您有下列 S3 用戶端使用預設設定。
S3Client s3Client = S3Client.create();
您想要下載大型檔案,並希望確保在下載完成之前請求不會逾時。若要完成此操作,請增加僅單一GetObject
請求的逾時值,如下列程式碼所示。
處理回應
SDK 會傳回大多數服務操作的回應物件。您的程式碼可以根據您的需求處理回應物件中的資訊。
例如,下列程式碼片段會列印出與上一個請求中的RunInstancesResponse
RunInstancesResponse runInstancesResponse = ec2Client.runInstances(runInstancesRequest); System.out.println(runInstancesResponse.instances().get(0).instanceId());
不過,並非所有操作都會傳回具有服務特定資料的回應物件。在這些情況下,您可以查詢HTTP回應狀態,以了解操作是否成功。
例如,下列程式碼片段中的程式碼會檢查HTTP回應,以查看 Amazon Simple Email Service DeleteContactList
SesV2Client sesv2Client = SesV2Client.create(); DeleteContactListRequest request = DeleteContactListRequest.builder() .contactListName("ExampleContactListName") .build(); DeleteContactListResponse response = sesv2Client.deleteContactList(request); if (response.sdkHttpResponse().isSuccessful()) { System.out.println("Contact list deleted successfully"); } else { System.out.println("Failed to delete contact list. Status code: " + response.sdkHttpResponse().statusCode()); }
處理例外狀況
SDK 使用執行期 (或未核取) 例外狀況,可讓您精細控制錯誤處理,並確保例外狀況處理會隨應用程式擴展。
SdkServiceException
SdkClientException
當您將檔案上傳至 時,此程式碼片段示範處理服務例外狀況的一種方式 Amazon S3。範例程式碼會同時擷取用戶端和伺服器例外狀況、記錄詳細資訊,並存在應用程式。
Region region = Region.US_WEST_2; s3Client = S3Client.builder() .region(region) .build(); try { PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket(bucketName) .key(key) .build(); s3Client.putObject(putObjectRequest, RequestBody.fromString("SDK for Java test")); } catch (S3Exception se) { System.err.println("Service exception thrown."); System.err.println(se.awsErrorDetails().errorMessage()); } catch (SdkClientExeption ce){ System.err.println("Client exception thrown."); System.err.println(ce.getMessage()); } finally { System.exit(1); }
如需詳細資訊,請參閱處理例外狀況。
使用服務生
有些請求需要一些時間來處理,例如在 中建立新資料表 DynamoDB 或建立新 Amazon S3 儲存貯體。若要確保資源在程式碼繼續執行之前已準備就緒,請使用 Waiter 。
例如,此程式碼片段會在 中建立新的資料表 ("myTable") DynamoDB,等待資料表處於 ACTIVE
狀態,然後列印出回應:
DynamoDbClient dynamoDbClient = DynamoDbClient.create(); DynamoDbWaiter dynamoDbWaiter = dynamoDbClient.waiter(); WaiterResponse<DescribeTableResponse> waiterResponse = dynamoDbWaiter.waitUntilTableExists(r -> r.tableName("myTable")); waiterResponse.matched().response().ifPresent(System.out::println);
如需詳細資訊,請參閱使用服務生。
設定逾時
您可以使用 apiCallTimeout
apiCallAttemptTimeout
ClientOverrideConfiguration.Builder
apiCallTimeout
設定是允許用戶端完成API呼叫執行的時間長度。apiCallAttemptTimeout
設定是等待每個HTTP請求 (重試) 完成的時間量,然後再放棄。
下列範例會設定 S3 用戶端的兩個逾時。
S3Client s3Client = S3Client.builder() .overrideConfiguration(b -> b .apiCallTimeout(Duration.ofSeconds(105L)) .apiCallAttemptTimeout(Duration.ofSeconds(25L))). build();
您也可以透過設定 AwsRequestOverrideConfiguration
overrideConfiguration
方法將其提供給請求物件,在請求層級設定逾時。
下列範例使用相同的逾時設定,但在 S3 PutObject
操作的請求層級。
S3Client basicS3Client = S3Client.create(); // Client with default timeout settings. AwsRequestOverrideConfiguration overrideConfiguration = AwsRequestOverrideConfiguration.builder() .apiCallTimeout(Duration.ofSeconds(105L)) .apiCallAttemptTimeout(Duration.ofSeconds(25L)) .build(); basicS3Client.putObject(b -> b .bucket("DOC-EXAMPLE-BUCKET") .key("DOC-EXAMPLE-KEY") .overrideConfiguration(overrideConfiguration), RequestBody.fromString("test"));
執行攔截器
您可以編寫程式碼,在API請求/回應生命週期的不同部分攔截請求和回應的執行。這可讓您發佈指標、修改處理中的請求、偵錯請求處理、檢視例外狀況等。如需詳細資訊,請參閱 參考中的 AWS SDK for Java APIExecutionInterceptor
介面