aboutsummaryrefslogtreecommitdiffstats
path: root/jaxrs_client_utils
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2018-09-27 13:37:59 +0200
committerMartin Polden <mpolden@mpolden.no>2018-09-27 13:37:59 +0200
commit248fd3bb2e3a46dad2d2d58e8f7701bfc947499b (patch)
treec04bd1fc183d83f1a606278f5aedd47010cb9fb1 /jaxrs_client_utils
parentb20c3bb6ef5a722ba879353eed2cc0d8da93ae9a (diff)
Re-use Jersey client
Diffstat (limited to 'jaxrs_client_utils')
-rw-r--r--jaxrs_client_utils/src/main/java/com/yahoo/vespa/jaxrs/client/JerseyJaxRsClientFactory.java58
1 files changed, 27 insertions, 31 deletions
diff --git a/jaxrs_client_utils/src/main/java/com/yahoo/vespa/jaxrs/client/JerseyJaxRsClientFactory.java b/jaxrs_client_utils/src/main/java/com/yahoo/vespa/jaxrs/client/JerseyJaxRsClientFactory.java
index 5a3ccfed490..9321f8e290d 100644
--- a/jaxrs_client_utils/src/main/java/com/yahoo/vespa/jaxrs/client/JerseyJaxRsClientFactory.java
+++ b/jaxrs_client_utils/src/main/java/com/yahoo/vespa/jaxrs/client/JerseyJaxRsClientFactory.java
@@ -8,6 +8,7 @@ import org.glassfish.jersey.client.proxy.WebResourceFactory;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
+import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.client.WebTarget;
@@ -16,17 +17,17 @@ import javax.ws.rs.core.UriBuilder;
import java.util.Collections;
/**
- * @author bakksjo
+ * Factory for creating Jersey clients from a JAX-RS resource interface.
+ *
+ * @author Oyvind Bakksjo
*/
public class JerseyJaxRsClientFactory implements JaxRsClientFactory {
+
private static final int DEFAULT_CONNECT_TIMEOUT_MS = 30000;
private static final int DEFAULT_READ_TIMEOUT_MS = 30000;
- private final int connectTimeoutMs;
- private final int readTimeoutMs;
- private final SSLContext sslContext;
- private final String userAgent;
- private final HostnameVerifier hostnameVerifier;
+ // Client is a heavy-weight object with a finalizer so we create only one and re-use it
+ private final Client client;
public JerseyJaxRsClientFactory() {
this(DEFAULT_CONNECT_TIMEOUT_MS, DEFAULT_READ_TIMEOUT_MS);
@@ -36,33 +37,23 @@ public class JerseyJaxRsClientFactory implements JaxRsClientFactory {
this(DEFAULT_CONNECT_TIMEOUT_MS, DEFAULT_READ_TIMEOUT_MS, sslContext, hostnameVerifier, userAgent);
}
- public JerseyJaxRsClientFactory(final int connectTimeoutMs, final int readTimeoutMs) {
+ public JerseyJaxRsClientFactory(int connectTimeoutMs, int readTimeoutMs) {
this(connectTimeoutMs, readTimeoutMs, null, null, null);
}
public JerseyJaxRsClientFactory(int connectTimeoutMs, int readTimeoutMs, SSLContext sslContext,
HostnameVerifier hostnameVerifier, String userAgent) {
- this.connectTimeoutMs = connectTimeoutMs;
- this.readTimeoutMs = readTimeoutMs;
- this.sslContext = sslContext;
- this.hostnameVerifier = hostnameVerifier;
- this.userAgent = userAgent;
- }
-
- /**
- * Contains some workarounds for HTTP/JAX-RS/Jersey issues. See:
- * https://jersey.java.net/apidocs/latest/jersey/org/glassfish/jersey/client/ClientProperties.html#SUPPRESS_HTTP_COMPLIANCE_VALIDATION
- * https://jersey.java.net/apidocs/latest/jersey/org/glassfish/jersey/client/HttpUrlConnectorProvider.html#SET_METHOD_WORKAROUND
- */
- @Override
- public <T> T createClient(final Class<T> apiClass, final HostName hostName, final int port, final String pathPrefix, String scheme) {
- final UriBuilder uriBuilder = UriBuilder.fromPath(pathPrefix).host(hostName.s()).port(port).scheme(scheme);
+ /*
+ * Configure client with some workarounds for HTTP/JAX-RS/Jersey issues. See:
+ * https://jersey.java.net/apidocs/latest/jersey/org/glassfish/jersey/client/ClientProperties.html#SUPPRESS_HTTP_COMPLIANCE_VALIDATION
+ * https://jersey.java.net/apidocs/latest/jersey/org/glassfish/jersey/client/HttpUrlConnectorProvider.html#SET_METHOD_WORKAROUND
+ */
ClientBuilder builder = ClientBuilder.newBuilder()
- .property(ClientProperties.CONNECT_TIMEOUT, connectTimeoutMs)
- .property(ClientProperties.READ_TIMEOUT, readTimeoutMs)
- .property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true) // Allow empty PUT. TODO: Fix API.
- .property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true) // Allow e.g. PATCH method.
- .property(ClientProperties.FOLLOW_REDIRECTS, true);
+ .property(ClientProperties.CONNECT_TIMEOUT, connectTimeoutMs)
+ .property(ClientProperties.READ_TIMEOUT, readTimeoutMs)
+ .property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true) // Allow empty PUT. TODO: Fix API.
+ .property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true) // Allow e.g. PATCH method.
+ .property(ClientProperties.FOLLOW_REDIRECTS, true);
if (sslContext != null) {
builder.sslContext(sslContext);
}
@@ -70,11 +61,16 @@ public class JerseyJaxRsClientFactory implements JaxRsClientFactory {
builder.hostnameVerifier(hostnameVerifier);
}
if (userAgent != null) {
- builder.register((ClientRequestFilter) context ->
- context.getHeaders().put(HttpHeaders.USER_AGENT, Collections.singletonList(userAgent)));
+ builder.register((ClientRequestFilter) context -> context.getHeaders().put(HttpHeaders.USER_AGENT, Collections.singletonList(userAgent)));
}
- final WebTarget target = builder.build().target(uriBuilder);
- // TODO: Check if this fills up non-heap memory with loaded classes.
+ this.client = builder.build();
+ }
+
+ @Override
+ public <T> T createClient(Class<T> apiClass, HostName hostName, int port, String pathPrefix, String scheme) {
+ UriBuilder uriBuilder = UriBuilder.fromPath(pathPrefix).host(hostName.s()).port(port).scheme(scheme);
+ WebTarget target = client.target(uriBuilder);
return WebResourceFactory.newResource(apiClass, target);
}
+
}