Skip to content

Commit

Permalink
Dynamodb - URL connection http client support
Browse files Browse the repository at this point in the history
  • Loading branch information
marcinczeczko committed Oct 9, 2019
1 parent cb3dbcb commit d8973fc
Show file tree
Hide file tree
Showing 18 changed files with 341 additions and 189 deletions.
5 changes: 5 additions & 0 deletions bom/runtime/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2177,6 +2177,11 @@
<artifactId>apache-client</artifactId>
<version>${awssdk.version}</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>url-connection-client</artifactId>
<version>${awssdk.version}</version>
</dependency>

<dependency>
<groupId>com.microsoft.azure.functions</groupId>
Expand Down
2 changes: 1 addition & 1 deletion docs/src/main/asciidoc/dynamodb-guide.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Keep in mind it's actively developed and does not support yet all the features a

The Quarkus extension supports two programming models:

* Blocking access using the Apache HTTP Client
* Blocking access using URL Connection HTTP client (by default) or the Apache HTTP Client
* https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/basics-async.html[Asynchronous programming] based on JDK's `CompletableFuture` objects and the Netty HTTP client.

In this guide, we see how you can get your REST services to use the DynamoDB locally and on AWS.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,21 @@
import io.quarkus.deployment.builditem.substrate.SubstrateProxyDefinitionBuildItem;
import io.quarkus.deployment.builditem.substrate.SubstrateResourceBuildItem;
import io.quarkus.deployment.configuration.ConfigurationError;
import io.quarkus.dynamodb.runtime.ApacheHttpClientConfig;
import io.quarkus.dynamodb.runtime.AwsCredentialsProviderType;
import io.quarkus.dynamodb.runtime.DynamodbClientProducer;
import io.quarkus.dynamodb.runtime.DynamodbConfig;
import io.quarkus.dynamodb.runtime.DynamodbRecorder;
import io.quarkus.dynamodb.runtime.NettyHttpClientConfig;
import io.quarkus.dynamodb.runtime.SyncHttpClientConfig;
import io.quarkus.dynamodb.runtime.SyncHttpClientConfig.SyncClientType;
import io.quarkus.dynamodb.runtime.TlsManagersProviderConfig;
import io.quarkus.dynamodb.runtime.TlsManagersProviderType;
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
import software.amazon.awssdk.http.SdkHttpService;
import software.amazon.awssdk.http.apache.ApacheSdkHttpService;
import software.amazon.awssdk.http.async.SdkAsyncHttpService;
import software.amazon.awssdk.http.nio.netty.NettySdkAsyncHttpService;
import software.amazon.awssdk.http.urlconnection.UrlConnectionSdkHttpService;
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.utils.StringUtils;
Expand Down Expand Up @@ -112,14 +114,20 @@ DynamodbClientBuildItem analyzeDynamodbClientInjectionPoints(BeanRegistrationPha
}

if (createSyncClient) {
//Register Apache client as sync client
proxyDefinition
.produce(new SubstrateProxyDefinitionBuildItem("org.apache.http.conn.HttpClientConnectionManager",
"org.apache.http.pool.ConnPoolControl",
"software.amazon.awssdk.http.apache.internal.conn.Wrapped"));

serviceProvider.produce(
new ServiceProviderBuildItem(SdkHttpService.class.getName(), ApacheSdkHttpService.class.getName()));
if (config.syncClient.type == SyncClientType.APACHE) {
//Register Apache client as sync client
proxyDefinition
.produce(new SubstrateProxyDefinitionBuildItem("org.apache.http.conn.HttpClientConnectionManager",
"org.apache.http.pool.ConnPoolControl",
"software.amazon.awssdk.http.apache.internal.conn.Wrapped"));

serviceProvider.produce(
new ServiceProviderBuildItem(SdkHttpService.class.getName(), ApacheSdkHttpService.class.getName()));
} else {
serviceProvider.produce(
new ServiceProviderBuildItem(SdkHttpService.class.getName(),
UrlConnectionSdkHttpService.class.getName()));
}
}

if (createAsyncClient) {
Expand Down Expand Up @@ -193,17 +201,19 @@ private static void checkConfig(DynamodbConfig config, List<String> knownInterce
}
}

private static void checkSyncClientConfig(ApacheHttpClientConfig syncClient) {
if (syncClient.maxConnections <= 0) {
throw new ConfigurationError("quarkus.dynamodb.sync-client.max-connections may not be negative or zero.");
}
if (syncClient.proxy != null && syncClient.proxy.enabled) {
URI proxyEndpoint = syncClient.proxy.endpoint;
if (proxyEndpoint != null) {
validateProxyEndpoint(proxyEndpoint, "sync");
private static void checkSyncClientConfig(SyncHttpClientConfig syncClient) {
if (syncClient.type == SyncClientType.APACHE) {
if (syncClient.apacheHttp.maxConnections <= 0) {
throw new ConfigurationError("quarkus.dynamodb.sync-client.max-connections may not be negative or zero.");
}
if (syncClient.apacheHttp.proxy != null && syncClient.apacheHttp.proxy.enabled) {
URI proxyEndpoint = syncClient.apacheHttp.proxy.endpoint;
if (proxyEndpoint != null) {
validateProxyEndpoint(proxyEndpoint, "sync");
}
}
validateTlsManagersProvider(syncClient.apacheHttp.tlsManagersProvider, "sync");
}
validateTlsManagersProvider(syncClient.tlsManagersProvider, "sync");
}

private static void checkAsyncClientConfig(NettyHttpClientConfig asyncClient) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import io.quarkus.test.QuarkusUnitTest;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

public class DynamodbSyncClientBrokenConfigTest {
public class DynamodbSyncApacheClientBrokenConfigTest {

@Inject
DynamoDbClient client;
Expand All @@ -21,7 +21,7 @@ public class DynamodbSyncClientBrokenConfigTest {
static final QuarkusUnitTest config = new QuarkusUnitTest()
.setExpectedException(ConfigurationError.class)
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addAsResource("sync-broken-config.properties", "application.properties"));
.addAsResource("sync-apache-broken-config.properties", "application.properties"));

@Test
public void test() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import io.quarkus.test.QuarkusUnitTest;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

public class DynamodbSyncClientBrokenProxyConfigTest {
public class DynamodbSyncApacheClientBrokenProxyConfigTest {

@Inject
DynamoDbClient client;
Expand All @@ -21,7 +21,7 @@ public class DynamodbSyncClientBrokenProxyConfigTest {
static final QuarkusUnitTest config = new QuarkusUnitTest()
.setExpectedException(ConfigurationError.class)
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addAsResource("sync-broken-proxy-config.properties", "application.properties"));
.addAsResource("sync-apache-broken-proxy-config.properties", "application.properties"));

@Test
public void test() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@
import io.quarkus.test.QuarkusUnitTest;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

public class DynamodbSyncClientFullConfigTest {
public class DynamodbSyncApacheClientFullConfigTest {

@Inject
DynamoDbClient client;

@RegisterExtension
static final QuarkusUnitTest config = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addAsResource("sync-full-config.properties", "application.properties"));
.addAsResource("sync-apache-full-config.properties", "application.properties"));

@Test
public void test() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.quarkus.dynamodb.deployment;

import javax.inject.Inject;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.test.QuarkusUnitTest;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

public class DynamodbSyncUrlConnClientFullConfigTest {

@Inject
DynamoDbClient client;

@RegisterExtension
static final QuarkusUnitTest config = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addAsResource("sync-urlconn-full-config.properties", "application.properties"));

@Test
public void test() {
// Application should start with full config.
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
quarkus.dynamodb.sync-client.type = APACHE
quarkus.dynamodb.sync-client.max-connections = -10


Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
quarkus.dynamodb.sync-client.type = APACHE
quarkus.dynamodb.sync-client.proxy.enabled = true
quarkus.dynamodb.sync-client.proxy.endpoint = http://user:[email protected]?foo=bar

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ quarkus.dynamodb.aws.credentials.type=STATIC
quarkus.dynamodb.aws.credentials.static-provider.access-key-id=test-key
quarkus.dynamodb.aws.credentials.static-provider.secret-access-key=test-secret

quarkus.dynamodb.sync-client.type = APACHE
quarkus.dynamodb.sync-client.socket-timeout = 0.100S
quarkus.dynamodb.sync-client.connection-timeout = 0.100S

quarkus.dynamodb.sync-client.connection-acquisition-timeout = 0.100S
quarkus.dynamodb.sync-client.connection-max-idle-time = 0.100S
quarkus.dynamodb.sync-client.connection-timeout = 0.100S
quarkus.dynamodb.sync-client.connection-time-to-live = 0.100S
quarkus.dynamodb.sync-client.socket-timeout = 0.100S
quarkus.dynamodb.sync-client.max-connections = 10
quarkus.dynamodb.sync-client.expect-continue-enabled = true
quarkus.dynamodb.sync-client.use-idle-connection-reaper = true
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
quarkus.dynamodb.enable-endpoint-discovery=false
quarkus.dynamodb.endpoint-override=http://localhost:8000

quarkus.dynamodb.aws.region=us-east-2
quarkus.dynamodb.aws.credentials.type=STATIC
quarkus.dynamodb.aws.credentials.static-provider.access-key-id=test-key
quarkus.dynamodb.aws.credentials.static-provider.secret-access-key=test-secret

quarkus.dynamodb.sync-client.type = URL
quarkus.dynamodb.sync-client.socket-timeout = 0.100S
quarkus.dynamodb.sync-client.connection-timeout = 0.100S


4 changes: 4 additions & 0 deletions extensions/amazon-dynamodb/runtime/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@
<groupId>software.amazon.awssdk</groupId>
<artifactId>netty-nio-client</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>url-connection-client</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
Expand Down

This file was deleted.

Loading

0 comments on commit d8973fc

Please sign in to comment.