Skip to content

Commit dec3a12

Browse files
committed
Make DynamoDb Clients Standalone
1 parent a45e735 commit dec3a12

File tree

2 files changed

+73
-4
lines changed

2 files changed

+73
-4
lines changed

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/dynamodb/DynamoDbAutoConfiguration.java

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,14 @@
3636
import org.springframework.context.annotation.Conditional;
3737
import org.springframework.context.annotation.Configuration;
3838
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
39+
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedAsyncClient;
3940
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
4041
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
42+
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
43+
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClientBuilder;
4144
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
4245
import software.amazon.awssdk.services.dynamodb.DynamoDbClientBuilder;
46+
import software.amazon.dax.ClusterDaxAsyncClient;
4347
import software.amazon.dax.ClusterDaxClient;
4448

4549
/**
@@ -51,7 +55,7 @@
5155
*/
5256
@AutoConfiguration
5357
@EnableConfigurationProperties(DynamoDbProperties.class)
54-
@ConditionalOnClass({ DynamoDbClient.class, DynamoDbEnhancedClient.class, DynamoDbTemplate.class })
58+
@ConditionalOnClass({ DynamoDbClient.class, DynamoDbAsyncClient.class })
5559
@AutoConfigureAfter({ CredentialsProviderAutoConfiguration.class, RegionProviderAutoConfiguration.class })
5660
@ConditionalOnProperty(name = "spring.cloud.aws.dynamodb.enabled", havingValue = "true", matchIfMissing = true)
5761
public class DynamoDbAutoConfiguration {
@@ -62,8 +66,9 @@ static class DaxDynamoDbClient {
6266

6367
@ConditionalOnMissingBean
6468
@Bean
65-
public DynamoDbClient dynamoDbClient(DynamoDbProperties properties, AwsCredentialsProvider credentialsProvider,
66-
AwsRegionProvider regionProvider) throws IOException {
69+
public DynamoDbClient daxDynamoDbClient(DynamoDbProperties properties,
70+
AwsCredentialsProvider credentialsProvider,
71+
AwsRegionProvider regionProvider) throws IOException {
6772
DaxProperties daxProperties = properties.getDax();
6873

6974
PropertyMapper propertyMapper = PropertyMapper.get();
@@ -93,6 +98,39 @@ public DynamoDbClient dynamoDbClient(DynamoDbProperties properties, AwsCredentia
9398
return ClusterDaxClient.builder().overrideConfiguration(configuration.build()).build();
9499
}
95100

101+
@ConditionalOnMissingBean
102+
@Bean
103+
public DynamoDbAsyncClient daxDynamoDbAsyncClient(DynamoDbProperties properties,
104+
AwsCredentialsProvider credentialsProvider,
105+
AwsRegionProvider regionProvider) throws IOException {
106+
DaxProperties daxProperties = properties.getDax();
107+
108+
PropertyMapper propertyMapper = PropertyMapper.get();
109+
software.amazon.dax.Configuration.Builder configuration = software.amazon.dax.Configuration.builder();
110+
propertyMapper.from(daxProperties.getIdleTimeoutMillis()).whenNonNull()
111+
.to(configuration::idleTimeoutMillis);
112+
propertyMapper.from(daxProperties.getConnectionTtlMillis()).whenNonNull()
113+
.to(configuration::connectionTtlMillis);
114+
propertyMapper.from(daxProperties.getConnectTimeoutMillis()).whenNonNull()
115+
.to(configuration::connectTimeoutMillis);
116+
propertyMapper.from(daxProperties.getRequestTimeoutMillis()).whenNonNull()
117+
.to(configuration::requestTimeoutMillis);
118+
propertyMapper.from(daxProperties.getWriteRetries()).whenNonNull().to(configuration::writeRetries);
119+
propertyMapper.from(daxProperties.getReadRetries()).whenNonNull().to(configuration::readRetries);
120+
propertyMapper.from(daxProperties.getClusterUpdateIntervalMillis()).whenNonNull()
121+
.to(configuration::clusterUpdateIntervalMillis);
122+
propertyMapper.from(daxProperties.getEndpointRefreshTimeoutMillis()).whenNonNull()
123+
.to(configuration::endpointRefreshTimeoutMillis);
124+
propertyMapper.from(daxProperties.getMaxConcurrency()).whenNonNull().to(configuration::maxConcurrency);
125+
propertyMapper.from(daxProperties.getMaxPendingConnectionAcquires()).whenNonNull()
126+
.to(configuration::maxPendingConnectionAcquires);
127+
propertyMapper.from(daxProperties.getSkipHostNameVerification()).whenNonNull()
128+
.to(configuration::skipHostNameVerification);
129+
130+
configuration.region(AwsClientBuilderConfigurer.resolveRegion(properties, regionProvider))
131+
.credentialsProvider(credentialsProvider).url(properties.getDax().getUrl());
132+
return ClusterDaxAsyncClient.builder().overrideConfiguration(configuration.build()).build();
133+
}
96134
}
97135

98136
@Conditional(MissingDaxUrlCondition.class)
@@ -101,20 +139,44 @@ static class StandardDynamoDbClient {
101139

102140
@ConditionalOnMissingBean
103141
@Bean
104-
public DynamoDbClient dynamoDbClient(AwsClientBuilderConfigurer awsClientBuilderConfigurer,
142+
public DynamoDbClient standardDynamoDbClient(AwsClientBuilderConfigurer awsClientBuilderConfigurer,
105143
ObjectProvider<AwsClientCustomizer<DynamoDbClientBuilder>> configurer, DynamoDbProperties properties) {
106144
return awsClientBuilderConfigurer
107145
.configure(DynamoDbClient.builder(), properties, configurer.getIfAvailable()).build();
108146
}
109147

110148
}
111149

150+
@Conditional(MissingDaxUrlCondition.class)
151+
@Configuration(proxyBeanMethods = false)
152+
static class StandardDynamoDbAsyncClient {
153+
154+
@ConditionalOnMissingBean
155+
@Bean
156+
public DynamoDbAsyncClient standardDynamoDbAsyncClient(AwsClientBuilderConfigurer awsClientBuilderConfigurer,
157+
ObjectProvider<AwsClientCustomizer<DynamoDbAsyncClientBuilder>> configurer,
158+
DynamoDbProperties properties) {
159+
return awsClientBuilderConfigurer
160+
.configure(DynamoDbAsyncClient.builder(), properties, configurer.getIfAvailable()).build();
161+
}
162+
163+
}
164+
112165
@ConditionalOnMissingBean
166+
@ConditionalOnClass(DynamoDbEnhancedClient.class)
113167
@Bean
114168
public DynamoDbEnhancedClient dynamoDbEnhancedClient(DynamoDbClient dynamoDbClient) {
115169
return DynamoDbEnhancedClient.builder().dynamoDbClient(dynamoDbClient).build();
116170
}
117171

172+
@ConditionalOnMissingBean
173+
@ConditionalOnClass(DynamoDbEnhancedAsyncClient.class)
174+
@Bean
175+
public DynamoDbEnhancedAsyncClient dynamoDbEnhancedAsyncClient(DynamoDbAsyncClient dynamoDbClient) {
176+
return DynamoDbEnhancedAsyncClient.builder().dynamoDbClient(dynamoDbClient).build();
177+
}
178+
179+
@ConditionalOnClass(DynamoDbTemplate.class)
118180
@ConditionalOnMissingBean(DynamoDbOperations.class)
119181
@Bean
120182
public DynamoDbTemplate dynamoDBTemplate(DynamoDbProperties properties,

spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/dynamodb/DynamoDbAutoConfigurationTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@
4040
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
4141
import software.amazon.awssdk.http.SdkHttpClient;
4242
import software.amazon.awssdk.http.apache.ApacheHttpClient;
43+
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
4344
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
4445
import software.amazon.awssdk.services.dynamodb.DynamoDbClientBuilder;
46+
import software.amazon.dax.ClusterDaxAsyncClient;
4547
import software.amazon.dax.ClusterDaxClient;
4648

4749
/**
@@ -96,6 +98,7 @@ void withDynamoDbClientCustomEndpoint() {
9698
contextRunner.withPropertyValues("spring.cloud.aws.dynamodb.endpoint:http://localhost:8090")
9799
.run(context -> {
98100
assertThat(context).hasSingleBean(DynamoDbClient.class);
101+
assertThat(context).hasSingleBean(DynamoDbAsyncClient.class);
99102
assertThat(context).hasSingleBean(DynamoDbTemplate.class);
100103
assertThat(context).hasSingleBean(DynamoDbEnhancedClient.class);
101104

@@ -109,6 +112,7 @@ void withDynamoDbClientCustomEndpoint() {
109112
void dynamoDbClientConfiguredSinceNoUrl() {
110113
contextRunner.run(context -> {
111114
assertThat(context).hasSingleBean(DynamoDbClient.class);
115+
assertThat(context).hasSingleBean(DynamoDbAsyncClient.class);
112116
assertThat(context).hasSingleBean(DynamoDbTemplate.class);
113117
assertThat(context).hasSingleBean(DynamoDbEnhancedClient.class);
114118
assertThat(context).doesNotHaveBean(ClusterDaxClient.class);
@@ -170,6 +174,7 @@ void defaultsAreUsedWhenPropertiesAreNotSet() {
170174
.run(context -> {
171175
ConfiguredDaxClient daxClient = new ConfiguredDaxClient(
172176
context.getBean(ClusterDaxClient.class));
177+
assertThat(context).hasSingleBean(ClusterDaxAsyncClient.class);
173178
assertThat(daxClient.getUrl())
174179
.isEqualTo("dax://something.dax-clusters.us-east-1.amazonaws.com");
175180
assertThat(daxClient.getWriteRetries()).isEqualTo(2);
@@ -211,6 +216,7 @@ void clusterDaxClient_CustomUrl_DefaultValues() {
211216
.run(context -> {
212217
ConfiguredDaxClient daxClient = new ConfiguredDaxClient(
213218
context.getBean(ClusterDaxClient.class));
219+
assertThat(context).hasSingleBean(ClusterDaxAsyncClient.class);
214220
assertThat(daxClient.getUrl())
215221
.isEqualTo("dax://something.dax-clusters.us-east-1.amazonaws.com");
216222
assertThat(daxClient.getWriteRetries()).isEqualTo(2);
@@ -237,6 +243,7 @@ void customTableResolverResolverCanBeConfigured() {
237243
assertThat(dynamoDBDynamoDbTableNameResolver)
238244
.isInstanceOf(CustomDynamoDBDynamoDbTableNameResolver.class);
239245

246+
assertThat(context).hasSingleBean(ClusterDaxAsyncClient.class);
240247
});
241248
}
242249

0 commit comments

Comments
 (0)