如何关闭RESTEasy代理对象关联的WebTarget与Client资源
RESTEasy代理模式下的资源清理问题
原始的RESTEasy代码片段如下:
UriBuilder FULL_PATH = UriBuilder.fromPath("http://127.0.0.1:8080/movies"); ResteasyClient client = (ResteasyClient)ClientBuilder.newClient(); ResteasyWebTarget target = client.target(FULL_PATH); MoviesResource proxy = target.proxy(MoviesResource.class); Movie movie = proxy.movieById(someId);
这种场景下,我们可以且应当手动关闭WebTarget或Client来释放已分配的资源。
但如果将代理对象的创建逻辑封装到单独类中,例如下面的Foo类:
public class Foo { private UriBuilder FULL_PATH = UriBuilder.fromPath("http://127.0.0.1:8080/movies"); public MoviesResource getMoviesApi() { ResteasyClient client = (ResteasyClient)ClientBuilder.newClient(); ResteasyWebTarget target = client.target(FULL_PATH); return target.proxy(MoviesResource.class); } } ... MoviesResource proxy = myFoo.getMoviesApi(); Movie movie = proxy.movieById(someId); // A) 此处如何清理资源?
此时面临的问题是:无法通过代理实例获取到WebTarget、Client的引用,该如何关闭这些对象及其底层资源?如果不手动关闭,会收到如下警告:
RESTEASY004687: Closing a class org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient43Engine instance for you. Please close clients yourself.
尽管RESTEasy会自动帮我们清理资源,但显然不应该依赖这种自动行为。
*补充说明:相关讨论涉及JAX-RS Client的线程安全性与对象复用性,比如哪些对象可以安全复用等内容。
内容的提问来源于stack exchange,提问作者Marcel Stör
相关产品推荐
相关产品推荐

