From 93a5673913fcf657e692e57154bc3a12a8b063ab Mon Sep 17 00:00:00 2001 From: jxiaobin Date: Sat, 5 Apr 2014 14:04:14 +0800 Subject: [PATCH] do not reuse OpenStack::CLIENT to avoid OOM --- .../openstack/connector/JaxRs20Connector.java | 4 +- .../woorea/openstack/connector/OpenStack.java | 53 ++++++++++--------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Connector.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Connector.java index 2171beacf..59c9d6cac 100644 --- a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Connector.java +++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/JaxRs20Connector.java @@ -21,11 +21,11 @@ public class JaxRs20Connector implements OpenStackClientConnector { - protected Client client = OpenStack.CLIENT; private LoggingFilter logger = new LoggingFilter(Logger.getLogger("os"), 10000); @Override public OpenStackResponse request(OpenStackRequest request) { + Client client = OpenStack.newClient(); WebTarget target = client.target(request.endpoint()).path(request.path()); for(Map.Entry > entry : request.queryParams().entrySet()) { @@ -60,6 +60,8 @@ public OpenStackResponse request(OpenStackRequest request) { } catch (ClientErrorException e) { throw new OpenStackResponseException(e.getResponse() .getStatusInfo().toString(), e.getResponse().getStatus()); + } finally { + client.close(); } } } diff --git a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/OpenStack.java b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/OpenStack.java index 879ce2cdb..2257d423b 100644 --- a/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/OpenStack.java +++ b/openstack-client-connectors/jersey2-connector/src/main/java/com/woorea/openstack/connector/OpenStack.java @@ -19,12 +19,12 @@ public class OpenStack { - public static Client CLIENT; - public static ObjectMapper DEFAULT_MAPPER; public static ObjectMapper WRAPPED_MAPPER; - + + private static SslConfigurator sslConfig; + static { initialize(); } @@ -55,7 +55,7 @@ private static void initialize() { context = SSLContext.getInstance("SSL"); context.init(null, null, null); - SslConfigurator sslConfig = SslConfigurator.newInstance(); + sslConfig = SslConfigurator.newInstance(); /* .trustStoreFile("./truststore_client") .trustStorePassword("asdfgh") @@ -65,8 +65,6 @@ private static void initialize() { */ //old: CLIENT.property(ClientProperties.SSL_CONFIG, new SslConfig(context)); - CLIENT = ClientBuilder.newBuilder().sslContext(sslConfig.createSSLContext()).build(); - DEFAULT_MAPPER = new ObjectMapper(); DEFAULT_MAPPER.setSerializationInclusion(Inclusion.NON_NULL); @@ -82,27 +80,34 @@ private static void initialize() { WRAPPED_MAPPER.enable(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE); WRAPPED_MAPPER.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY); WRAPPED_MAPPER.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES); - - CLIENT.register(new JacksonFeature()).register(new ContextResolver() { - - public ObjectMapper getContext(Class type) { - return type.getAnnotation(JsonRootName.class) == null ? DEFAULT_MAPPER : WRAPPED_MAPPER; - } - - }); - - CLIENT.register(new ClientRequestFilter() { - - public void filter(ClientRequestContext requestContext) throws IOException { - requestContext.getHeaders().remove("Content-Language"); - requestContext.getHeaders().remove("Content-Encoding"); - } - }); - } catch(Exception e) { throw new RuntimeException(e.getMessage(), e); } - } + private static class CustomContextResolver implements ContextResolver { + public ObjectMapper getContext(Class type) { + return type.getAnnotation(JsonRootName.class) == null ? DEFAULT_MAPPER : WRAPPED_MAPPER; + } + } + + private static final CustomContextResolver CONTEXT_RESOLVER = new CustomContextResolver(); + + private static class ContentHeaderFilter implements ClientRequestFilter { + public void filter(ClientRequestContext requestContext) throws IOException { + requestContext.getHeaders().remove("Content-Language"); + requestContext.getHeaders().remove("Content-Encoding"); + } + } + + private static final ContentHeaderFilter HEADER_FILTER = new ContentHeaderFilter(); + + private static final JacksonFeature JACKSON_FEATURE = new JacksonFeature(); + + public static Client newClient() { + Client client = ClientBuilder.newBuilder().sslContext(sslConfig.createSSLContext()).build(); + client.register(JACKSON_FEATURE).register(CONTEXT_RESOLVER); + client.register(HEADER_FILTER); + return client; + } }