Skip to content

Commit

Permalink
Add support for ServiceUnavailableRetryStrategy (dropwizard#2185)
Browse files Browse the repository at this point in the history
* Add support for ServiceUnavailableRetryStrategy

Resolves dropwizard#2093.

* Remove unused imports

* Remove unused field

* @nickbabcock: expand glob imports
  • Loading branch information
patrox authored and zebra-kangaroo committed Nov 21, 2017
1 parent 68be347 commit eba2536
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import io.dropwizard.lifecycle.Managed;
import io.dropwizard.setup.Environment;
import io.dropwizard.util.Duration;
import javax.net.ssl.HostnameVerifier;
import org.apache.http.ConnectionReuseStrategy;
import org.apache.http.Header;
import org.apache.http.HttpHost;
Expand All @@ -26,6 +25,7 @@
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.RedirectStrategy;
import org.apache.http.client.ServiceUnavailableRetryStrategy;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
Expand All @@ -46,6 +46,7 @@
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpProcessor;

import javax.net.ssl.HostnameVerifier;
import java.util.List;

/**
Expand Down Expand Up @@ -78,6 +79,7 @@ public class HttpClientBuilder {
private boolean disableContentCompression;
private List<? extends Header> defaultHeaders;
private HttpProcessor httpProcessor;
private ServiceUnavailableRetryStrategy serviceUnavailableRetryStrategy;

public HttpClientBuilder(MetricRegistry metricRegistry) {
this.metricRegistry = metricRegistry;
Expand Down Expand Up @@ -221,6 +223,17 @@ public HttpClientBuilder using(HttpProcessor httpProcessor) {
return this;
}

/**
* Use the given {@link ServiceUnavailableRetryStrategy} instance
*
* @param serviceUnavailableRetryStrategy a {@link ServiceUnavailableRetryStrategy} instance
* @return {@code} this
*/
public HttpClientBuilder using(ServiceUnavailableRetryStrategy serviceUnavailableRetryStrategy) {
this.serviceUnavailableRetryStrategy = serviceUnavailableRetryStrategy;
return this;
}

/**
* Disable support of decompression of responses
*
Expand Down Expand Up @@ -389,6 +402,10 @@ public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
builder.setHttpProcessor(httpProcessor);
}

if (serviceUnavailableRetryStrategy != null) {
builder.setServiceUnavailableRetryStrategy(serviceUnavailableRetryStrategy);
}

return new ConfiguredCloseableHttpClient(builder.build(), requestConfig);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import io.dropwizard.util.Duration;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.ServiceUnavailableRetryStrategy;
import org.apache.http.config.Registry;
import org.apache.http.conn.DnsResolver;
import org.apache.http.conn.routing.HttpRoutePlanner;
Expand Down Expand Up @@ -313,6 +314,17 @@ public JerseyClientBuilder using(CredentialsProvider credentialsProvider) {
return this;
}

/**
* Use the given {@link ServiceUnavailableRetryStrategy} instance.
*
* @param serviceUnavailableRetryStrategy a {@link ServiceUnavailableRetryStrategy} instance
* @return {@code this}
*/
public JerseyClientBuilder using(ServiceUnavailableRetryStrategy serviceUnavailableRetryStrategy) {
apacheHttpClientBuilder.using(serviceUnavailableRetryStrategy);
return this;
}

/**
* Builds the {@link RxClient} instance.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.RedirectStrategy;
import org.apache.http.client.ServiceUnavailableRetryStrategy;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
Expand Down Expand Up @@ -678,6 +679,19 @@ public void usesHttpProcessor() throws Exception {
.isSameAs(httpProcessor);
}

@Test
public void usesServiceUnavailableRetryStrategy() throws Exception {
ServiceUnavailableRetryStrategy serviceUnavailableRetryStrategy = mock(ServiceUnavailableRetryStrategy.class);
final ConfiguredCloseableHttpClient client =
builder.using(serviceUnavailableRetryStrategy)
.createClient(apacheBuilder, connectionManager, "test");
assertThat(client).isNotNull();
assertThat(FieldUtils.getField(httpClientBuilderClass,
"serviceUnavailStrategy", true)
.get(apacheBuilder))
.isSameAs(serviceUnavailableRetryStrategy);
}

@Test
public void allowsCustomBuilderConfiguration() throws Exception {
CustomBuilder builder = new CustomBuilder(new MetricRegistry());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import io.dropwizard.lifecycle.setup.LifecycleEnvironment;
import io.dropwizard.setup.Environment;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.ServiceUnavailableRetryStrategy;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.DnsResolver;
Expand Down Expand Up @@ -272,6 +273,13 @@ public void usesACustomHostnameVerifier() {
verify(apacheHttpClientBuilder).using(customHostnameVerifier);
}

@Test
public void usesACustomServiceUnavailableRetryStrategy() {
final ServiceUnavailableRetryStrategy customServiceUnavailableRetryStrategy = mock(ServiceUnavailableRetryStrategy.class);
builder.using(customServiceUnavailableRetryStrategy);
verify(apacheHttpClientBuilder).using(customServiceUnavailableRetryStrategy);
}

@Test
public void usesACustomConnectionFactoryRegistry() throws Exception {
final SSLContext ctx = SSLContext.getInstance(SSLConnectionSocketFactory.TLS);
Expand Down

0 comments on commit eba2536

Please sign in to comment.