diff options
author | Martin Polden <mpolden@mpolden.no> | 2018-09-27 13:37:59 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2018-09-27 13:37:59 +0200 |
commit | 248fd3bb2e3a46dad2d2d58e8f7701bfc947499b (patch) | |
tree | c04bd1fc183d83f1a606278f5aedd47010cb9fb1 /jaxrs_client_utils/src | |
parent | b20c3bb6ef5a722ba879353eed2cc0d8da93ae9a (diff) |
Re-use Jersey client
Diffstat (limited to 'jaxrs_client_utils/src')
-rw-r--r-- | jaxrs_client_utils/src/main/java/com/yahoo/vespa/jaxrs/client/JerseyJaxRsClientFactory.java | 58 |
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); } + } |