Repository: cxf Updated Branches: refs/heads/master 013e6c800 -> e4cb2ea43
[CXF-6852] Some work on auto-cleanup of classloader for dynamic client Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/e4cb2ea4 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/e4cb2ea4 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/e4cb2ea4 Branch: refs/heads/master Commit: e4cb2ea437185caa28b95a2344ffa8aa0ba516b7 Parents: 013e6c8 Author: Daniel Kulp <dk...@apache.org> Authored: Wed Mar 22 14:32:31 2017 -0400 Committer: Daniel Kulp <dk...@apache.org> Committed: Wed Mar 22 15:19:07 2017 -0400 ---------------------------------------------------------------------- .../endpoint/dynamic/DynamicClientFactory.java | 27 +++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/e4cb2ea4/rt/frontend/simple/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java ---------------------------------------------------------------------- diff --git a/rt/frontend/simple/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java b/rt/frontend/simple/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java index 600a2f8..1640cfc 100644 --- a/rt/frontend/simple/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java +++ b/rt/frontend/simple/src/main/java/org/apache/cxf/endpoint/dynamic/DynamicClientFactory.java @@ -284,6 +284,25 @@ public class DynamicClientFactory { return createClient(wsdlUrl.toString(), service, classLoader, port, bindingFiles); } + static class DynamicClientImpl extends ClientImpl implements AutoCloseable { + final ClassLoader cl; + final ClassLoader orig; + DynamicClientImpl(Bus bus, Service svc, QName port, + EndpointImplFactory endpointImplFactory, + ClassLoader l) { + super(bus, svc, port, endpointImplFactory); + cl = l; + orig = Thread.currentThread().getContextClassLoader(); + } + @Override + public void close() throws Exception { + destroy(); + if (Thread.currentThread().getContextClassLoader() == cl) { + Thread.currentThread().setContextClassLoader(orig); + } + } + } + public Client createClient(String wsdlUrl, QName service, ClassLoader classLoader, QName port, List<String> bindingFiles) { @@ -298,9 +317,6 @@ public class DynamicClientFactory { sf.setAllowElementRefs(allowRefs); Service svc = sf.create(); - ClientImpl client = new ClientImpl(bus, svc, port, - getEndpointImplFactory()); - //all SI's should have the same schemas SchemaCollection schemas = svc.getServiceInfos().get(0).getXmlSchemaCollection(); @@ -378,7 +394,7 @@ public class DynamicClientFactory { throw new IllegalStateException("Internal error; a directory returns a malformed URL: " + mue.getMessage(), mue); } - ClassLoader cl = ClassLoaderUtils.getURLClassLoader(urls, classLoader); + final ClassLoader cl = ClassLoaderUtils.getURLClassLoader(urls, classLoader); JAXBContext context; Map<String, Object> contextProperties = jaxbContextProperties; @@ -402,6 +418,9 @@ public class DynamicClientFactory { databinding.setContext(context); svc.setDataBinding(databinding); + ClientImpl client = new DynamicClientImpl(bus, svc, port, + getEndpointImplFactory(), cl); + ServiceInfo svcfo = client.getEndpoint().getEndpointInfo().getService(); // Setup the new classloader!