异步回调笔记

异步回调

除使用 Java Future 对象监控异步请求的状态,开发工具包还允许您实施使用 AsyncHandler 接口的类。AsyncHandler 提供两种根据请求完成方式调用的方法:onSuccess 和 onError。

回调接口方法的主要优势是它让您无需轮询 Future 对象即可确定请求是否已完成。相反,您的代码能够立即开始其下一个活动,并由开发工具包在适当时调用处理程序。

// A code block
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 并将其传递给AWS SDK for Java异步客户端。

例如,您可以提供一个 ExecutorService 实施,它使用自定义的 ThreadFactory 控制池中各个线程的命名方式,或者记录有关线程使用的更多信息。

异步访问

这些区域有:TransferManager开发工具包中的类为使用提供异步支持Amazon S3.TransferManager管理异步上传和下载、提供传输的详细进度报告并支持对不同事件的回调。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值