给定以下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
以释放我分配的资源 *。
但是,如果代理对象的创建和它所依赖的一切都被移交给一个单独的类,我该怎么办?
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) how to clean up here?
如何关闭WebTarget
或Client
或它们的底层资源?我无法通过代理示例访问它们中的任何一个。如果我 * 不 * 关闭它们,就会收到这个可怕的警告
重新灭菌004687:正在为您关闭类org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient43Engine示例。请自行关闭客户端。
因此,RESTEasy确实为我做了清理,但这当然不是我应该依赖的。
- 在许多地方(例如Reusing JAX RS Client in multi-threaded environment (with resteasy)和Is JAX-RS Client Thread Safe)都有关于哪些内容可重用、哪些内容不可重用的讨论
1条答案
按热度按时间ddrv8njm1#
感谢来自@james-r-perkins的所有反馈,我最终得到了下面的(Kotlin)代码:
与我之前的评论相反,RESTEasy MP
RestClientBuilderImpl
和QuarkusQuarkusRestClientBuilder
确实创建了 * 也 * 实现Closeable
(扩展AutoCloseable
)的代理。然而,我们看到了强制客户端接口直接扩展
AutoCloseable
的价值。当然,这在源代码中是一些额外的字符,但从好的方面来说,它是编译器可以用来简化其他地方代码的类型信息。因此,这里泛型声明是T : AutoCloseable
而不是T : Any
是至关重要的。