java 如何关闭代理的RESTEasy WebTarget

wlsrxk51  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(119)

给定以下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);

我可以/能够/应该关闭WebTargetClient以释放我分配的资源 *。
但是,如果代理对象的创建和它所依赖的一切都被移交给一个单独的类,我该怎么办?

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?

如何关闭WebTargetClient或它们的底层资源?我无法通过代理示例访问它们中的任何一个。如果我 * 不 * 关闭它们,就会收到这个可怕的警告
重新灭菌004687:正在为您关闭类org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient43Engine示例。请自行关闭客户端。
因此,RESTEasy确实为我做了清理,但这当然不是我应该依赖的。

ddrv8njm

ddrv8njm1#

感谢来自@james-r-perkins的所有反馈,我最终得到了下面的(Kotlin)代码:

final inline fun <reified T : AutoCloseable> createServiceProxy(
    serviceName: String
): T = RestClientBuilder.newBuilder()
    .baseUri(createServiceUriBuilder(serviceName).build())
    .register(MyClientRequestFilter(appName, tokenProvider))
    .build(T::class.java)

与我之前的评论相反,RESTEasy MP RestClientBuilderImpl和Quarkus QuarkusRestClientBuilder确实创建了 * 也 * 实现Closeable(扩展AutoCloseable)的代理。
然而,我们看到了强制客户端接口直接扩展AutoCloseable的价值。当然,这在源代码中是一些额外的字符,但从好的方面来说,它是编译器可以用来简化其他地方代码的类型信息。因此,这里泛型声明是T : AutoCloseable而不是T : Any是至关重要的。

相关问题