From 00820c425078de262dfd1d6ddcd333a53e8afdba Mon Sep 17 00:00:00 2001 From: musketyr Date: Thu, 10 Oct 2024 17:10:28 +0200 Subject: [PATCH] Ability to specify different HTTP clients --- .../micronaut-aws-sdk-dependencies.gradle | 6 ++++ .../awssdk/cloudwatch/CloudWatchFactory.java | 7 +++-- .../cloudwatchlogs/CloudWatchLogsFactory.java | 7 +++-- .../micronaut-amazon-awssdk-core.gradle | 11 +++++++ ...DefaultRegionAndEndpointConfiguration.java | 18 +++++++++++ .../core/RegionAndEndpointConfiguration.java | 17 +++++++++- .../ApacheHttpClientBuilderFactory.java | 22 +++++++++++++ .../AwsCrtHttpClientBuilderFactory.java | 31 +++++++++++++++++++ .../core/client/ClientBuilderProvider.java | 19 ++++++++++++ .../client/DefaultClientBuilderProvider.java | 31 +++++++++++++++++++ .../client/NettyHttpClientBuilderFactory.java | 22 +++++++++++++ ...UrlConnectionHttpClientBuilderFactory.java | 25 +++++++++++++++ .../client/ClientBuilderProviderSpec.groovy | 24 ++++++++++++++ .../micronaut-amazon-awssdk-dynamodb.gradle | 5 +++ .../dynamodb/DynamoDBClientsFactory.java | 9 ++++-- ...AdvancedQueryOnDeclarativeServiceTest.java | 4 +++ .../DefaultDynamoDBServiceNoRangeSpec.groovy | 4 +++ .../amazon/awssdk/kinesis/KinesisFactory.java | 9 ++++-- .../awssdk/lambda/LambdaClientFactory.java | 7 +++-- .../s3/SimpleStorageServiceFactory.java | 7 +++-- .../awssdk/ses/SimpleEmailServiceFactory.java | 7 +++-- .../sns/SimpleNotificationServiceFactory.java | 7 +++-- .../sqs/SimpleQueueServiceConfiguration.java | 19 ++++++++++++ .../awssdk/sqs/SimpleQueueServiceFactory.java | 7 +++-- .../sts/SecurityTokenServiceFactory.java | 7 +++-- 25 files changed, 309 insertions(+), 23 deletions(-) create mode 100644 subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/ApacheHttpClientBuilderFactory.java create mode 100644 subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/AwsCrtHttpClientBuilderFactory.java create mode 100644 subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/ClientBuilderProvider.java create mode 100644 subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/DefaultClientBuilderProvider.java create mode 100644 subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/NettyHttpClientBuilderFactory.java create mode 100644 subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/UrlConnectionHttpClientBuilderFactory.java create mode 100644 subprojects/micronaut-amazon-awssdk-core/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/core/client/ClientBuilderProviderSpec.groovy diff --git a/platforms/micronaut-aws-sdk-dependencies/micronaut-aws-sdk-dependencies.gradle b/platforms/micronaut-aws-sdk-dependencies/micronaut-aws-sdk-dependencies.gradle index ff49edaf0..a67a9cb1c 100644 --- a/platforms/micronaut-aws-sdk-dependencies/micronaut-aws-sdk-dependencies.gradle +++ b/platforms/micronaut-aws-sdk-dependencies/micronaut-aws-sdk-dependencies.gradle @@ -55,6 +55,12 @@ dependencies { api "software.amazon.awssdk:sts:$project.awsSdk2Version" api "software.amazon.awssdk:aws-query-protocol:$project.awsSdk2Version" + // HTTP clients + api "software.amazon.awssdk:aws-crt-client:$project.awsSdk2Version" + api "software.amazon.awssdk:url-connection-client:$project.awsSdk2Version" + api "software.amazon.awssdk:netty-nio-client:$project.awsSdk2Version" + api "software.amazon.awssdk:apache-client:$project.awsSdk2Version" + api group: 'com.amazonaws', name: 'amazon-dax-client', version: '1.0.230341.0' api group: 'com.amazonaws', name: 'aws-lambda-java-events', version: awsLambdaEventsVersion api group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-cbor', version: project['jackson.datatype.version'] diff --git a/subprojects/micronaut-amazon-awssdk-cloudwatch/src/main/java/com/agorapulse/micronaut/amazon/awssdk/cloudwatch/CloudWatchFactory.java b/subprojects/micronaut-amazon-awssdk-cloudwatch/src/main/java/com/agorapulse/micronaut/amazon/awssdk/cloudwatch/CloudWatchFactory.java index 48949bf31..3ab5340a6 100644 --- a/subprojects/micronaut-amazon-awssdk-cloudwatch/src/main/java/com/agorapulse/micronaut/amazon/awssdk/cloudwatch/CloudWatchFactory.java +++ b/subprojects/micronaut-amazon-awssdk-cloudwatch/src/main/java/com/agorapulse/micronaut/amazon/awssdk/cloudwatch/CloudWatchFactory.java @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.amazon.awssdk.cloudwatch; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; import io.micronaut.context.annotation.Bean; import io.micronaut.context.annotation.Factory; import io.micronaut.context.annotation.Requires; @@ -44,10 +45,11 @@ public class CloudWatchFactory { CloudWatchClient cloudWatch( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, CloudWatchConfiguration configuration ) { return configuration - .configure(CloudWatchClient.builder().credentialsProvider(credentialsProvider), awsRegionProvider) + .configure(CloudWatchClient.builder().credentialsProvider(credentialsProvider), awsRegionProvider, builderProvider) .build(); } @@ -58,10 +60,11 @@ CloudWatchAsyncClient cloudWatchAsync( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, CloudWatchConfiguration configuration, + ClientBuilderProvider builderProvider, Optional httpClient ) { CloudWatchAsyncClientBuilder builder = configuration - .configure(CloudWatchAsyncClient.builder().credentialsProvider(credentialsProvider), awsRegionProvider); + .configure(CloudWatchAsyncClient.builder().credentialsProvider(credentialsProvider), awsRegionProvider, builderProvider); httpClient.ifPresent(builder::httpClient); return builder.build(); } diff --git a/subprojects/micronaut-amazon-awssdk-cloudwatchlogs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/cloudwatchlogs/CloudWatchLogsFactory.java b/subprojects/micronaut-amazon-awssdk-cloudwatchlogs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/cloudwatchlogs/CloudWatchLogsFactory.java index aa9d4e0b6..f878f1ba1 100644 --- a/subprojects/micronaut-amazon-awssdk-cloudwatchlogs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/cloudwatchlogs/CloudWatchLogsFactory.java +++ b/subprojects/micronaut-amazon-awssdk-cloudwatchlogs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/cloudwatchlogs/CloudWatchLogsFactory.java @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.amazon.awssdk.cloudwatchlogs; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; import io.micronaut.aws.sdk.v2.service.cloudwatchlogs.CloudwatchLogsClientFactory; import io.micronaut.context.annotation.Bean; import io.micronaut.context.annotation.Factory; @@ -47,10 +48,11 @@ public class CloudWatchLogsFactory { CloudWatchLogsClient cloudWatchLogs( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, CloudWatchLogsConfiguration configuration ) { return configuration - .configure(CloudWatchLogsClient.builder().credentialsProvider(credentialsProvider), awsRegionProvider) + .configure(CloudWatchLogsClient.builder().credentialsProvider(credentialsProvider), awsRegionProvider, builderProvider) .build(); } @@ -61,11 +63,12 @@ CloudWatchLogsClient cloudWatchLogs( CloudWatchLogsAsyncClient cloudWatchAsync( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, CloudWatchLogsConfiguration configuration, Optional httpClient ) { CloudWatchLogsAsyncClientBuilder builder = configuration - .configure(CloudWatchLogsAsyncClient.builder().credentialsProvider(credentialsProvider), awsRegionProvider); + .configure(CloudWatchLogsAsyncClient.builder().credentialsProvider(credentialsProvider), awsRegionProvider, builderProvider); httpClient.ifPresent(builder::httpClient); return builder.build(); } diff --git a/subprojects/micronaut-amazon-awssdk-core/micronaut-amazon-awssdk-core.gradle b/subprojects/micronaut-amazon-awssdk-core/micronaut-amazon-awssdk-core.gradle index 375f5e2a8..43b7e550d 100644 --- a/subprojects/micronaut-amazon-awssdk-core/micronaut-amazon-awssdk-core.gradle +++ b/subprojects/micronaut-amazon-awssdk-core/micronaut-amazon-awssdk-core.gradle @@ -17,4 +17,15 @@ */ dependencies { api 'software.amazon.awssdk:aws-core' + + // HTTP clients + compileOnly "software.amazon.awssdk:aws-crt-client:$project.awsSdk2Version" + compileOnly "software.amazon.awssdk:url-connection-client:$project.awsSdk2Version" + compileOnly "software.amazon.awssdk:netty-nio-client:$project.awsSdk2Version" + compileOnly "software.amazon.awssdk:apache-client:$project.awsSdk2Version" + + testImplementation "software.amazon.awssdk:aws-crt-client:$project.awsSdk2Version" + testImplementation "software.amazon.awssdk:url-connection-client:$project.awsSdk2Version" + testImplementation "software.amazon.awssdk:netty-nio-client:$project.awsSdk2Version" + testImplementation "software.amazon.awssdk:apache-client:$project.awsSdk2Version" } diff --git a/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/DefaultRegionAndEndpointConfiguration.java b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/DefaultRegionAndEndpointConfiguration.java index a9a2ad9a9..0f20df5bf 100644 --- a/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/DefaultRegionAndEndpointConfiguration.java +++ b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/DefaultRegionAndEndpointConfiguration.java @@ -40,7 +40,25 @@ public void setEndpoint(String endpoint) { this.endpoint = endpoint; } + public String getClient() { + return client; + } + + public void setClient(String client) { + this.client = client; + } + + public String getAsyncClient() { + return asyncClient; + } + + public void setAsyncClient(String asyncClient) { + this.asyncClient = asyncClient; + } + @Nullable private String region; @Nullable private String endpoint; + @Nullable private String client; + @Nullable private String asyncClient; } diff --git a/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/RegionAndEndpointConfiguration.java b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/RegionAndEndpointConfiguration.java index a2bdc8704..483146964 100644 --- a/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/RegionAndEndpointConfiguration.java +++ b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/RegionAndEndpointConfiguration.java @@ -17,8 +17,11 @@ */ package com.agorapulse.micronaut.amazon.awssdk.core; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; +import software.amazon.awssdk.awscore.client.builder.AwsAsyncClientBuilder; import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder; import software.amazon.awssdk.awscore.presigner.SdkPresigner; +import software.amazon.awssdk.core.client.builder.SdkSyncClientBuilder; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.regions.providers.AwsRegionProvider; @@ -32,7 +35,11 @@ public interface RegionAndEndpointConfiguration { String getEndpoint(); - default > B configure(B builder, AwsRegionProvider awsRegionProvider) { + String getClient(); + + String getAsyncClient(); + + default > B configure(B builder, AwsRegionProvider awsRegionProvider, ClientBuilderProvider builderProvider) { builder.region(Optional.ofNullable(getRegion()).map(Region::of).orElseGet(awsRegionProvider::getRegion)); if (getEndpoint() != null) { @@ -43,6 +50,14 @@ default > B configure(B builder, AwsRegionPr } } + if (getClient() != null && builder instanceof SdkSyncClientBuilder clientBuilder) { + builderProvider.findHttpClientBuilder(getClient()).ifPresent(clientBuilder::httpClientBuilder); + } + + if (getAsyncClient() != null && builder instanceof AwsAsyncClientBuilder clientBuilder) { + builderProvider.findAsyncHttpClientBuilder(getClient()).ifPresent(clientBuilder::httpClientBuilder); + } + return builder; } diff --git a/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/ApacheHttpClientBuilderFactory.java b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/ApacheHttpClientBuilderFactory.java new file mode 100644 index 000000000..4064c6821 --- /dev/null +++ b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/ApacheHttpClientBuilderFactory.java @@ -0,0 +1,22 @@ +package com.agorapulse.micronaut.amazon.awssdk.core.client; + +import io.micronaut.context.annotation.Bean; +import io.micronaut.context.annotation.Factory; +import io.micronaut.context.annotation.Requires; +import jakarta.inject.Named; +import jakarta.inject.Singleton; +import software.amazon.awssdk.http.SdkHttpClient; +import software.amazon.awssdk.http.apache.ApacheHttpClient; + +@Factory +@Requires(classes = ApacheHttpClient.class) +public class ApacheHttpClientBuilderFactory { + + @Bean + @Singleton + @Named("apache") + public SdkHttpClient.Builder awsCrtHttpClientBuilder() { + return ApacheHttpClient.builder(); + } + +} diff --git a/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/AwsCrtHttpClientBuilderFactory.java b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/AwsCrtHttpClientBuilderFactory.java new file mode 100644 index 000000000..15979ab12 --- /dev/null +++ b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/AwsCrtHttpClientBuilderFactory.java @@ -0,0 +1,31 @@ +package com.agorapulse.micronaut.amazon.awssdk.core.client; + +import io.micronaut.context.annotation.Bean; +import io.micronaut.context.annotation.Factory; +import io.micronaut.context.annotation.Requires; +import jakarta.inject.Named; +import jakarta.inject.Singleton; +import software.amazon.awssdk.http.SdkHttpClient; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; +import software.amazon.awssdk.http.crt.AwsCrtHttpClient; + +@Factory +@Requires(classes = {AwsCrtHttpClient.class, AwsCrtAsyncHttpClient.class}) +public class AwsCrtHttpClientBuilderFactory { + + @Bean + @Singleton + @Named("aws-crt") + public SdkAsyncHttpClient.Builder awsCrtHttpAsyncClientBuilder() { + return AwsCrtAsyncHttpClient.builder(); + } + + @Bean + @Singleton + @Named("aws-crt") + public SdkHttpClient.Builder awsCrtHttpClientBuilder() { + return AwsCrtHttpClient.builder(); + } + +} diff --git a/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/ClientBuilderProvider.java b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/ClientBuilderProvider.java new file mode 100644 index 000000000..8f1f595f5 --- /dev/null +++ b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/ClientBuilderProvider.java @@ -0,0 +1,19 @@ +package com.agorapulse.micronaut.amazon.awssdk.core.client; + +import software.amazon.awssdk.http.SdkHttpClient; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; + +import java.util.Optional; + +public interface ClientBuilderProvider { + + String APACHE = "apache"; + String AWS_CRT = "aws-crt"; + String URL_CONNECTION = "url-connection"; + String NETTY = "netty"; + + > Optional> findHttpClientBuilder(String implementation); + + > Optional> findAsyncHttpClientBuilder(String implementation); + +} diff --git a/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/DefaultClientBuilderProvider.java b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/DefaultClientBuilderProvider.java new file mode 100644 index 000000000..ba1a368db --- /dev/null +++ b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/DefaultClientBuilderProvider.java @@ -0,0 +1,31 @@ +package com.agorapulse.micronaut.amazon.awssdk.core.client; + +import io.micronaut.context.annotation.Bean; +import software.amazon.awssdk.http.SdkHttpClient; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; + +import java.util.Map; +import java.util.Optional; + +@Bean +public class DefaultClientBuilderProvider implements ClientBuilderProvider { + + private final Map> httpClientBuilders; + private final Map> httpAsyncClientBuilders; + + public DefaultClientBuilderProvider(Map> httpClientBuilders, Map> httpAsyncClientBuilders) { + this.httpClientBuilders = httpClientBuilders; + this.httpAsyncClientBuilders = httpAsyncClientBuilders; + } + + @Override + public > Optional> findHttpClientBuilder(String implementation) { + return Optional.ofNullable((SdkHttpClient.Builder) httpClientBuilders.get(implementation)); + } + + @Override + public > Optional> findAsyncHttpClientBuilder(String implementation) { + return Optional.ofNullable((SdkAsyncHttpClient.Builder) httpAsyncClientBuilders.get(implementation)); + } + +} diff --git a/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/NettyHttpClientBuilderFactory.java b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/NettyHttpClientBuilderFactory.java new file mode 100644 index 000000000..0273180a9 --- /dev/null +++ b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/NettyHttpClientBuilderFactory.java @@ -0,0 +1,22 @@ +package com.agorapulse.micronaut.amazon.awssdk.core.client; + +import io.micronaut.context.annotation.Bean; +import io.micronaut.context.annotation.Factory; +import io.micronaut.context.annotation.Requires; +import jakarta.inject.Named; +import jakarta.inject.Singleton; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; + +@Factory +@Requires(classes = NettyNioAsyncHttpClient.class) +public class NettyHttpClientBuilderFactory { + + @Bean + @Singleton + @Named("netty") + public SdkAsyncHttpClient.Builder nettyHttpAsyncClientBuilder() { + return NettyNioAsyncHttpClient.builder(); + } + +} diff --git a/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/UrlConnectionHttpClientBuilderFactory.java b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/UrlConnectionHttpClientBuilderFactory.java new file mode 100644 index 000000000..75a3d28f3 --- /dev/null +++ b/subprojects/micronaut-amazon-awssdk-core/src/main/java/com/agorapulse/micronaut/amazon/awssdk/core/client/UrlConnectionHttpClientBuilderFactory.java @@ -0,0 +1,25 @@ +package com.agorapulse.micronaut.amazon.awssdk.core.client; + +import io.micronaut.context.annotation.Bean; +import io.micronaut.context.annotation.Factory; +import io.micronaut.context.annotation.Requires; +import jakarta.inject.Named; +import jakarta.inject.Singleton; +import software.amazon.awssdk.http.SdkHttpClient; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.crt.AwsCrtAsyncHttpClient; +import software.amazon.awssdk.http.crt.AwsCrtHttpClient; +import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient; + +@Factory +@Requires(classes = UrlConnectionHttpClient.class) +public class UrlConnectionHttpClientBuilderFactory { + + @Bean + @Singleton + @Named("url-connection") + public SdkHttpClient.Builder awsCrtHttpClientBuilder() { + return UrlConnectionHttpClient.builder(); + } + +} diff --git a/subprojects/micronaut-amazon-awssdk-core/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/core/client/ClientBuilderProviderSpec.groovy b/subprojects/micronaut-amazon-awssdk-core/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/core/client/ClientBuilderProviderSpec.groovy new file mode 100644 index 000000000..e33d52f4d --- /dev/null +++ b/subprojects/micronaut-amazon-awssdk-core/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/core/client/ClientBuilderProviderSpec.groovy @@ -0,0 +1,24 @@ +package com.agorapulse.micronaut.amazon.awssdk.core.client + +import io.micronaut.test.extensions.spock.annotation.MicronautTest +import jakarta.inject.Inject +import spock.lang.Specification + +@MicronautTest +class ClientBuilderProviderSpec extends Specification { + + @Inject ClientBuilderProvider provider + + void 'known providers found'() { + expect: + verifyAll(provider) { + findHttpClientBuilder(ClientBuilderProvider.APACHE).present + findHttpClientBuilder(ClientBuilderProvider.AWS_CRT).present + findHttpClientBuilder(ClientBuilderProvider.URL_CONNECTION).present + + findAsyncHttpClientBuilder(ClientBuilderProvider.NETTY).present + findAsyncHttpClientBuilder(ClientBuilderProvider.AWS_CRT).present + } + } + +} diff --git a/subprojects/micronaut-amazon-awssdk-dynamodb/micronaut-amazon-awssdk-dynamodb.gradle b/subprojects/micronaut-amazon-awssdk-dynamodb/micronaut-amazon-awssdk-dynamodb.gradle index d89e8d3e8..949449b15 100644 --- a/subprojects/micronaut-amazon-awssdk-dynamodb/micronaut-amazon-awssdk-dynamodb.gradle +++ b/subprojects/micronaut-amazon-awssdk-dynamodb/micronaut-amazon-awssdk-dynamodb.gradle @@ -31,6 +31,11 @@ dependencies { testImplementation project(':micronaut-amazon-awssdk-integration-testing') testImplementation 'io.micronaut.rxjava2:micronaut-rxjava2' testImplementation 'io.micronaut:micronaut-jackson-databind' + + testImplementation "software.amazon.awssdk:aws-crt-client:$project.awsSdk2Version" + testImplementation "software.amazon.awssdk:url-connection-client:$project.awsSdk2Version" + testImplementation "software.amazon.awssdk:netty-nio-client:$project.awsSdk2Version" + testImplementation "software.amazon.awssdk:apache-client:$project.awsSdk2Version" } if (project.findProperty('test.aws.dynamodb.v2') == 'async') { diff --git a/subprojects/micronaut-amazon-awssdk-dynamodb/src/main/java/com/agorapulse/micronaut/amazon/awssdk/dynamodb/DynamoDBClientsFactory.java b/subprojects/micronaut-amazon-awssdk-dynamodb/src/main/java/com/agorapulse/micronaut/amazon/awssdk/dynamodb/DynamoDBClientsFactory.java index 106def4a6..49ed0231a 100644 --- a/subprojects/micronaut-amazon-awssdk-dynamodb/src/main/java/com/agorapulse/micronaut/amazon/awssdk/dynamodb/DynamoDBClientsFactory.java +++ b/subprojects/micronaut-amazon-awssdk-dynamodb/src/main/java/com/agorapulse/micronaut/amazon/awssdk/dynamodb/DynamoDBClientsFactory.java @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.amazon.awssdk.dynamodb; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; import io.micronaut.aws.sdk.v2.service.dynamodb.DynamoDbClientFactory; import io.micronaut.context.annotation.Bean; import io.micronaut.context.annotation.Factory; @@ -45,10 +46,11 @@ public class DynamoDBClientsFactory { public DynamoDbClient dynamoDbClient( DynamoDBConfiguration configuration, AwsCredentialsProvider awsCredentialsProvider, - AwsRegionProvider awsRegionProvider + AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider ) { DynamoDbClientBuilder builder = DynamoDbClient.builder().credentialsProvider(awsCredentialsProvider); - configuration.configure(builder, awsRegionProvider); + configuration.configure(builder, awsRegionProvider, builderProvider); return builder.build(); } @@ -59,10 +61,11 @@ public DynamoDbAsyncClient dynamoDbAsyncClient( DynamoDBConfiguration configuration, AwsCredentialsProvider awsCredentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, Optional httpClient ) { DynamoDbAsyncClientBuilder builder = DynamoDbAsyncClient.builder().credentialsProvider(awsCredentialsProvider); - configuration.configure(builder, awsRegionProvider); + configuration.configure(builder, awsRegionProvider, builderProvider); httpClient.ifPresent(builder::httpClient); return builder.build(); } diff --git a/subprojects/micronaut-amazon-awssdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/dynamodb/AdvancedQueryOnDeclarativeServiceTest.java b/subprojects/micronaut-amazon-awssdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/dynamodb/AdvancedQueryOnDeclarativeServiceTest.java index feeaf4ac0..6aac9bc77 100644 --- a/subprojects/micronaut-amazon-awssdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/dynamodb/AdvancedQueryOnDeclarativeServiceTest.java +++ b/subprojects/micronaut-amazon-awssdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/dynamodb/AdvancedQueryOnDeclarativeServiceTest.java @@ -17,6 +17,8 @@ */ package com.agorapulse.micronaut.amazon.awssdk.dynamodb; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; +import io.micronaut.context.annotation.Property; import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import jakarta.inject.Inject; import org.junit.jupiter.api.Test; @@ -31,6 +33,8 @@ import static org.junit.jupiter.api.Assertions.*; @MicronautTest +@Property(name = "aws.dynamodb.client", value = ClientBuilderProvider.AWS_CRT) +@Property(name = "aws.dynamodb.async-client", value = ClientBuilderProvider.AWS_CRT) public class AdvancedQueryOnDeclarativeServiceTest { private static final Instant REFERENCE_DATE = Instant.ofEpochMilli(1358487600000L); diff --git a/subprojects/micronaut-amazon-awssdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/dynamodb/DefaultDynamoDBServiceNoRangeSpec.groovy b/subprojects/micronaut-amazon-awssdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/dynamodb/DefaultDynamoDBServiceNoRangeSpec.groovy index 38fce11a8..0dd0195c5 100644 --- a/subprojects/micronaut-amazon-awssdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/dynamodb/DefaultDynamoDBServiceNoRangeSpec.groovy +++ b/subprojects/micronaut-amazon-awssdk-dynamodb/src/test/groovy/com/agorapulse/micronaut/amazon/awssdk/dynamodb/DefaultDynamoDBServiceNoRangeSpec.groovy @@ -17,6 +17,8 @@ */ package com.agorapulse.micronaut.amazon.awssdk.dynamodb +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider +import io.micronaut.context.annotation.Property import io.micronaut.test.extensions.spock.annotation.MicronautTest import io.reactivex.Flowable import spock.lang.Specification @@ -27,6 +29,8 @@ import jakarta.inject.Inject * Specification for testing DefaultDynamoDBService using entity with no range key. */ @MicronautTest +@Property(name = 'aws.dynamodb.client', value = ClientBuilderProvider.URL_CONNECTION) +@Property(name = 'aws.dynamodb.async-client', value = ClientBuilderProvider.NETTY) class DefaultDynamoDBServiceNoRangeSpec extends Specification { @Inject DynamoDBEntityNoRangeService service diff --git a/subprojects/micronaut-amazon-awssdk-kinesis/src/main/java/com/agorapulse/micronaut/amazon/awssdk/kinesis/KinesisFactory.java b/subprojects/micronaut-amazon-awssdk-kinesis/src/main/java/com/agorapulse/micronaut/amazon/awssdk/kinesis/KinesisFactory.java index dc009fb3f..faf9e8360 100644 --- a/subprojects/micronaut-amazon-awssdk-kinesis/src/main/java/com/agorapulse/micronaut/amazon/awssdk/kinesis/KinesisFactory.java +++ b/subprojects/micronaut-amazon-awssdk-kinesis/src/main/java/com/agorapulse/micronaut/amazon/awssdk/kinesis/KinesisFactory.java @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.amazon.awssdk.kinesis; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; import com.fasterxml.jackson.databind.ObjectMapper; import io.micronaut.context.annotation.Bean; import io.micronaut.context.annotation.EachBean; @@ -42,9 +43,10 @@ public class KinesisFactory { KinesisClient kinesis( KinesisConfiguration configuration, AwsCredentialsProvider credentialsProvider, - AwsRegionProvider awsRegionProvider + AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider ) { - return configuration.configure(KinesisClient.builder(), awsRegionProvider) + return configuration.configure(KinesisClient.builder(), awsRegionProvider, builderProvider) .credentialsProvider(credentialsProvider) .build(); } @@ -56,10 +58,11 @@ KinesisAsyncClient kinesisAsync( KinesisConfiguration configuration, AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, Optional httpClient ) { KinesisAsyncClientBuilder builder = KinesisAsyncClient.builder().credentialsProvider(credentialsProvider); - configuration.configure(builder, awsRegionProvider); + configuration.configure(builder, awsRegionProvider, builderProvider); httpClient.ifPresent(builder::httpClient); return builder.build(); } diff --git a/subprojects/micronaut-amazon-awssdk-lambda/src/main/java/com/agorapulse/micronaut/amazon/awssdk/lambda/LambdaClientFactory.java b/subprojects/micronaut-amazon-awssdk-lambda/src/main/java/com/agorapulse/micronaut/amazon/awssdk/lambda/LambdaClientFactory.java index 530e6b2f8..791fc72af 100644 --- a/subprojects/micronaut-amazon-awssdk-lambda/src/main/java/com/agorapulse/micronaut/amazon/awssdk/lambda/LambdaClientFactory.java +++ b/subprojects/micronaut-amazon-awssdk-lambda/src/main/java/com/agorapulse/micronaut/amazon/awssdk/lambda/LambdaClientFactory.java @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.amazon.awssdk.lambda; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; import io.micronaut.context.annotation.Bean; import io.micronaut.context.annotation.EachBean; import io.micronaut.context.annotation.Factory; @@ -41,9 +42,10 @@ public class LambdaClientFactory { LambdaClient lambdaClient( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, LambdaConfiguration configuration ) { - return configuration.configure(LambdaClient.builder(), awsRegionProvider) + return configuration.configure(LambdaClient.builder(), awsRegionProvider, builderProvider) .credentialsProvider(credentialsProvider) .build(); } @@ -54,11 +56,12 @@ LambdaClient lambdaClient( LambdaAsyncClient lambdaAsyncClient( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, LambdaConfiguration configuration, Optional httpClient ) { LambdaAsyncClientBuilder builder = LambdaAsyncClient.builder().credentialsProvider(credentialsProvider); - configuration.configure(builder, awsRegionProvider); + configuration.configure(builder, awsRegionProvider, builderProvider); httpClient.ifPresent(builder::httpClient); return builder.build(); } diff --git a/subprojects/micronaut-amazon-awssdk-s3/src/main/java/com/agorapulse/micronaut/amazon/awssdk/s3/SimpleStorageServiceFactory.java b/subprojects/micronaut-amazon-awssdk-s3/src/main/java/com/agorapulse/micronaut/amazon/awssdk/s3/SimpleStorageServiceFactory.java index f9e0c8680..1d8ed86dd 100644 --- a/subprojects/micronaut-amazon-awssdk-s3/src/main/java/com/agorapulse/micronaut/amazon/awssdk/s3/SimpleStorageServiceFactory.java +++ b/subprojects/micronaut-amazon-awssdk-s3/src/main/java/com/agorapulse/micronaut/amazon/awssdk/s3/SimpleStorageServiceFactory.java @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.amazon.awssdk.s3; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; import io.micronaut.aws.sdk.v2.service.s3.S3ClientFactory; import io.micronaut.context.annotation.EachBean; import io.micronaut.context.annotation.Factory; @@ -42,9 +43,10 @@ public class SimpleStorageServiceFactory { public S3Client s3Client( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, SimpleStorageServiceConfiguration configuration ) { - return configuration.configure(S3Client.builder(), awsRegionProvider) + return configuration.configure(S3Client.builder(), awsRegionProvider, builderProvider) .credentialsProvider(credentialsProvider) .forcePathStyle(configuration.getForcePathStyle()) .build(); @@ -72,6 +74,7 @@ public S3Presigner s3Presigner( public S3AsyncClient s3AsyncClient( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, SimpleStorageServiceConfiguration configuration, Optional httpClient ) { @@ -79,7 +82,7 @@ public S3AsyncClient s3AsyncClient( .forcePathStyle(configuration.getForcePathStyle()) .credentialsProvider(credentialsProvider); httpClient.ifPresent(builder::httpClient); - configuration.configure(builder, awsRegionProvider); + configuration.configure(builder, awsRegionProvider, builderProvider); return builder.build(); } diff --git a/subprojects/micronaut-amazon-awssdk-ses/src/main/java/com/agorapulse/micronaut/amazon/awssdk/ses/SimpleEmailServiceFactory.java b/subprojects/micronaut-amazon-awssdk-ses/src/main/java/com/agorapulse/micronaut/amazon/awssdk/ses/SimpleEmailServiceFactory.java index b59a87690..38ccb3927 100644 --- a/subprojects/micronaut-amazon-awssdk-ses/src/main/java/com/agorapulse/micronaut/amazon/awssdk/ses/SimpleEmailServiceFactory.java +++ b/subprojects/micronaut-amazon-awssdk-ses/src/main/java/com/agorapulse/micronaut/amazon/awssdk/ses/SimpleEmailServiceFactory.java @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.amazon.awssdk.ses; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; import io.micronaut.aws.sdk.v2.service.ses.SesClientFactory; import io.micronaut.context.annotation.Bean; import io.micronaut.context.annotation.Factory; @@ -40,9 +41,10 @@ public class SimpleEmailServiceFactory { public SesClient sesClient( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, SimpleEmailServiceConfiguration configuration ) { - return configuration.configure(SesClient.builder(), awsRegionProvider) + return configuration.configure(SesClient.builder(), awsRegionProvider, builderProvider) .credentialsProvider(credentialsProvider) .build(); } @@ -53,12 +55,13 @@ public SesClient sesClient( public SesAsyncClient sesAsyncClient( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, SimpleEmailServiceConfiguration configuration, Optional httpClient ) { SesAsyncClientBuilder builder = SesAsyncClient.builder().credentialsProvider(credentialsProvider); httpClient.ifPresent(builder::httpClient); - configuration.configure(builder, awsRegionProvider); + configuration.configure(builder, awsRegionProvider, builderProvider); return builder.build(); } diff --git a/subprojects/micronaut-amazon-awssdk-sns/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sns/SimpleNotificationServiceFactory.java b/subprojects/micronaut-amazon-awssdk-sns/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sns/SimpleNotificationServiceFactory.java index 4a52bce28..8f791ce9c 100644 --- a/subprojects/micronaut-amazon-awssdk-sns/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sns/SimpleNotificationServiceFactory.java +++ b/subprojects/micronaut-amazon-awssdk-sns/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sns/SimpleNotificationServiceFactory.java @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.amazon.awssdk.sns; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; import com.fasterxml.jackson.databind.ObjectMapper; import io.micronaut.aws.sdk.v2.service.sns.SnsClientFactory; import io.micronaut.context.annotation.EachBean; @@ -41,9 +42,10 @@ public class SimpleNotificationServiceFactory { SnsClient snsClient( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, SimpleNotificationServiceConfiguration configuration ) { - return configuration.configure(SnsClient.builder(), awsRegionProvider) + return configuration.configure(SnsClient.builder(), awsRegionProvider, builderProvider) .credentialsProvider(credentialsProvider) .build(); } @@ -54,11 +56,12 @@ SnsClient snsClient( SnsAsyncClient snsAsyncClient( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, SimpleNotificationServiceConfiguration configuration, Optional httpClient ) { SnsAsyncClientBuilder builder = SnsAsyncClient.builder().credentialsProvider(credentialsProvider); - configuration.configure(builder, awsRegionProvider); + configuration.configure(builder, awsRegionProvider, builderProvider); httpClient.ifPresent(builder::httpClient); return builder.build(); } diff --git a/subprojects/micronaut-amazon-awssdk-sqs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sqs/SimpleQueueServiceConfiguration.java b/subprojects/micronaut-amazon-awssdk-sqs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sqs/SimpleQueueServiceConfiguration.java index df5ce235b..8b1f71dc1 100644 --- a/subprojects/micronaut-amazon-awssdk-sqs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sqs/SimpleQueueServiceConfiguration.java +++ b/subprojects/micronaut-amazon-awssdk-sqs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sqs/SimpleQueueServiceConfiguration.java @@ -32,6 +32,8 @@ public abstract class SimpleQueueServiceConfiguration extends QueueConfiguration @Nullable private String region; @Nullable private String endpoint; + @Nullable private String client; + @Nullable private String asyncClient; public String getQueueNamePrefix() { return queueNamePrefix; @@ -73,4 +75,21 @@ public void setEndpoint(String endpoint) { this.endpoint = endpoint; } + @Override + public @Nullable String getClient() { + return client; + } + + public void setClient(@Nullable String client) { + this.client = client; + } + + @Override + public @Nullable String getAsyncClient() { + return asyncClient; + } + + public void setAsyncClient(@Nullable String asyncClient) { + this.asyncClient = asyncClient; + } } diff --git a/subprojects/micronaut-amazon-awssdk-sqs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sqs/SimpleQueueServiceFactory.java b/subprojects/micronaut-amazon-awssdk-sqs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sqs/SimpleQueueServiceFactory.java index 36a893754..8035d5e3a 100644 --- a/subprojects/micronaut-amazon-awssdk-sqs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sqs/SimpleQueueServiceFactory.java +++ b/subprojects/micronaut-amazon-awssdk-sqs/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sqs/SimpleQueueServiceFactory.java @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.amazon.awssdk.sqs; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; import io.micronaut.aws.sdk.v2.service.sqs.SqsClientFactory; import io.micronaut.context.annotation.EachBean; import io.micronaut.context.annotation.Factory; @@ -43,9 +44,10 @@ public class SimpleQueueServiceFactory { SqsClient sqsClient( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, SimpleQueueServiceConfiguration configuration ) { - return configuration.configure(SqsClient.builder(), awsRegionProvider) + return configuration.configure(SqsClient.builder(), awsRegionProvider, builderProvider) .credentialsProvider(credentialsProvider) .build(); } @@ -56,11 +58,12 @@ SqsClient sqsClient( SqsAsyncClient sqsAsyncClient( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, SimpleQueueServiceConfiguration configuration, Optional httpClient ) { SqsAsyncClientBuilder builder = SqsAsyncClient.builder().credentialsProvider(credentialsProvider); - configuration.configure(builder, awsRegionProvider); + configuration.configure(builder, awsRegionProvider, builderProvider); httpClient.ifPresent(builder::httpClient); return builder.build(); } diff --git a/subprojects/micronaut-amazon-awssdk-sts/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sts/SecurityTokenServiceFactory.java b/subprojects/micronaut-amazon-awssdk-sts/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sts/SecurityTokenServiceFactory.java index f6ed0b500..6f1b084a7 100644 --- a/subprojects/micronaut-amazon-awssdk-sts/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sts/SecurityTokenServiceFactory.java +++ b/subprojects/micronaut-amazon-awssdk-sts/src/main/java/com/agorapulse/micronaut/amazon/awssdk/sts/SecurityTokenServiceFactory.java @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.amazon.awssdk.sts; +import com.agorapulse.micronaut.amazon.awssdk.core.client.ClientBuilderProvider; import io.micronaut.context.annotation.Bean; import io.micronaut.context.annotation.Factory; import io.micronaut.context.annotation.Requires; @@ -39,10 +40,11 @@ public class SecurityTokenServiceFactory { StsClient awsSecurityTokenService( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, SecurityTokenServiceConfiguration configuration ) { return configuration - .configure(StsClient.builder().credentialsProvider(credentialsProvider), awsRegionProvider) + .configure(StsClient.builder().credentialsProvider(credentialsProvider), awsRegionProvider, builderProvider) .build(); } @@ -51,11 +53,12 @@ StsClient awsSecurityTokenService( StsAsyncClient awsSecurityTokenAsyncService( AwsCredentialsProvider credentialsProvider, AwsRegionProvider awsRegionProvider, + ClientBuilderProvider builderProvider, SecurityTokenServiceConfiguration configuration, Optional httpClient ) { StsAsyncClientBuilder builder = StsAsyncClient.builder().credentialsProvider(credentialsProvider); - configuration.configure(builder, awsRegionProvider); + configuration.configure(builder, awsRegionProvider, builderProvider); httpClient.ifPresent(builder::httpClient); return builder.build(); }