【问题标题】:Java AWS SDK 2.x Async Client - can’t override thread pool executorJava AWS SDK 2.x 异步客户端 - 无法覆盖线程池执行程序
【发布时间】:2019-07-12 19:57:03
【问题描述】:

我想为 AWS SDK 2.x 的异步客户端(例如SnsAsyncClient)设置自定义线程池执行器。我看到对于 AWS SDK 1.x,客户端构建器上存在 withExecutorFactory,而对于 2.x,我们需要在客户端构建器上设置 ClientAsyncConfiguration 并调用 asyncConfiguration 方法:

ClientAsyncConfiguration.Builder asyncConfig = ClientAsyncConfiguration.builder()
        .advancedOptions(Map.of(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR,
                myCustomExecutor));
SnsAsyncClient.builder()
        .asyncConfiguration(asyncConfig.build())
        .build();

不过,自定义线程池执行器不适用。我希望CompletableFuture 上的所有异步调用和后续调用都将在自定义执行器上执行,但事实并非如此。 在调试期间,我看到逻辑在不同的线程池上执行:aws-java-sdk-NettyEventLoop-0-X、ForkJoinPool.commonPool-worker-X。 AWS SNS 异步调用示例:

snsAsyncClient.publish(publishRequest)
        .thenApplyAsync(..)
        .whenCompleteAsync(..);

如何设置自定义线程池,让异步非阻塞IO操作在特定线程池上执行?

AWS 开发工具包版本:software.amazon.awssdk sdk-core 2.7.3

【问题讨论】:

    标签: java amazon-web-services asynchronous aws-sdk completable-future


    【解决方案1】:

    异步配置SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR的思想是提供线程池执行器,用于后续对CompletableFuture的调用,如thenApply(..)和whenComplete(..)。由于CompletableFuture 的实现,该执行器将不适用于thenApplyAsync 和whenCompleteAsync 等方法(如果执行器未传入thenApplyAsync,则默认使用ForkJoinPool.commonPool(),或者我们可以将自定义执行器作为第二个方法参数)。

    snsAsyncClient.publish(publishRequest)
            .thenApply(..)
            .whenComplete(..);
    

    thenApply 和 whenComplete 中的代码将在来自 FUTURE_COMPLETION_EXECUTOR 的配置执行器上处理。

    为了设置异步客户端配置并提高性能,我们应该创建NettyNioAsyncHttpClient.Builder 的实例并使用方法httpClientBuilder 将其传递给异步客户端

    var asyncHttpClientBuilder = NettyNioAsyncHttpClient.builder()
            .maxConcurrency(100)
            .connectionTimeout(Duration.ofSeconds(20))
            .connectionAcquisitionTimeout(Duration.ofSeconds(20));
    SnsAsyncClient.builder()
            .httpClientBuilder(asyncHttpClientBuilder)
            .build();
    

    【讨论】:

      猜你喜欢
      • 2023-01-14
      • 2015-11-21
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2014-08-27
      相关资源
      最近更新 更多