本文介绍了使用AWS SDK for Java发出请求的各种同步和异步方法,并总结了一些其他信息,以帮助您成功使用异步功能。
本文描述了使用AWS SDK for Java发出请求的各种同步和异步方法。本文最后提供了一些其他信息,以帮助您成功使用SDK中的异步操作。
AWS SDK for Java提供了同步和异步方法,开发人员可以使用这些方法调用AWS服务上的操作。同步方法将阻塞,直到客户端收到服务的最终响应。异步方法允许您向服务发送请求,然后立即将控制权传递回您的代码,而不是阻塞,直到远程服务返回响应。这对许多应用程序都很方便,特别是在编写用户界面时。
同步访问
使用同步/阻塞客户端在AWS Web服务上调用操作的基本模式如下所示:
AmazonDynamoDB dynamoDB = new AmazonDynamoDBClient(myCredentials);
try {
DescribeTableResult result = dynamoDB.describeTable(new DescribeTableRequest().withTableName(myTableName));
System.out.println("Table: " + result.getTable());
} catch (AmazonClientException ace) {
System.out.println("Error describing table: " + ace.getMessage());
}
在前面的示例中,当dynamoDB.describeTable调用操作时,SDK将HTTP请求发送到Amazon DynamoDB,等待服务返回响应,解析它,然后返回DescribeTableResult给调用者,然后调用者可以继续执行。
异步访问
同步方法是调用AWS服务的简单方法,但在某些应用程序中,在服务返回响应之前阻塞可能会有问题。对于这些情况,您可以使用异步方法。这些方法是非阻塞的,即它们立即返回。一旦远程服务器处理完请求,异步方法为开发人员提供了两种简单的方法来访问服务响应:
Java Futures -使用标准Java Future接口获取异步请求的状态。
异步回调 - 实现回调接口,当异步请求的生命周期中发生某些事件时,SDK将调用该接口上的方法。例如,SDK在请求成功完成或请求失败并出现错误时调用接口。
Java Futures
在Java中处理异步操作的最常用方法之一是通过 java.util.concurrent.Future类。Java Futures允许异步操作立即返回调用者可以轮询操作状态的结果(Future对象)。当调用者检测到操作已完成时,调用者可以使用Future对象访问结果或可能发生的任何错误。
以下代码演示了如何使用Futures异步执行前面的同步访问部分中显示的对Amazon DynamoDB的相同调用:
AmazonDynamoDBAsync dynamoDB = new AmazonDynamoDBAsyncClient(myCredentials);
Future future = dynamoDB.describeTableAsync(new DescribeTableRequest().withTableName(myTableName));
while (!future.isDone()) {
Thread.sleep(1000);
// Do other processing while you're waiting for the response
}
try {
DescribeTableResult result = future.get();
System.out.println("Table: " + result.getTable());
} catch (ExecutionException ee) {
// Futures always wrap errors as an ExecutionException.
// The *real* exception is stored as the cause of the ExecutionException
Throwable exception = ee.getCause();
System.out.println("Error describing table: " + exception.getMessage());
}
Java Futures允许您异步执行操作并检查其状态,但它们仍然要求开发人员轮询Future对象以确定操作是否已完成。下一节将介绍在SDK中使用异步操作的更简单方法:异步回调。
异步回调
除了使用Java Futures监视异步请求的状态之外,SDK还允许您实现可以传递给异步方法的简单异步回调接口。当异步请求的生命周期中发生各种事件时,例如请求成功完成或失败时,SDK会调用实现中的关联方法AsyncHandler,以便您轻松处理事件。
此代码演示了如何实现AsyncHandler接口,以便在异步请求完成或失败时让SDK发出警报:
AmazonDynamoDBAsync dynamoDB = new AmazonDynamoDBAsyncClient(myCredentials);
dynamoDB.describeTableAsync(new DescribeTableRequest().withTableName(myTableName), new AsyncHandler() {
public void onSuccess(DescribeTableRequest request, DescribeTableResult result) {
System.out.println("Table: " + result.getTable());
}
public void onError(Exception exception) {
System.out.println("Error describing table: " + exception.getMessage());
// Callers can also test if exception is an instance of
// AmazonServiceException or AmazonClientException and cast
// it to get additional information
}
});
Java Futures和AsyncHandler回调接口完全兼容。如果您愿意,可以在代码中使用Futures和回调接口,但通常只需一种方法即可。回调接口方法的主要优点是,它使您不必轮询Future对象以找出请求何时完成。相反,您的代码可以立即启动其下一个活动,并依赖SDK在适当的时间调用您的处理程序。
技巧和窍门
回调执行
使用AsyncHandler回调非常适合使用操作结果更新UI。请记住,您的实现AsyncHandler是在异步客户端拥有的线程池内执行的。在您的AsyncHandler实现中,最简单,快速执行的代码是最合适的。在AsyncHandler实现中长时间运行或阻塞代码可能导致争用异步客户端使用的线程池,并可能阻止客户端执行请求。如果您有一个需要从回调开始的长时间运行的任务,那么只需让回调在一个新线程或您的应用程序管理的另一个线程池中运行该任务。
线程池配置
SDK中的异步客户端提供了一个适用于大多数应用程序的默认线程池,但如果您想要更好地控制线程池的管理方式,您也可以自由地为异步客户端提供自己的ExecutorService。例如,您可以提供自己ExecutorService的自定义ThreadFactory来控制池中线程的命名方式,或者记录有关线程使用情况的其他信息。
Amazon S3异步访问
SDK中 的TransferManager类为使用Amazon Simple Storage Service(Amazon S3)提供异步支持。TransferManager管理异步上载和下载,提供有关传输的详细进度报告,并支持回调到不同事件。









网友评论