如何正确分享JAX-RS 2.0客户端

15
为了更好地理解我的问题,我有一个Java EE Web应用程序(作为UI /客户端),通过使用JAX-RS 2.0客户端API(Resteasy实现)的REST接口访问数据/业务逻辑服务。
目前,我每个请求注入一个新的JAXRS Client实例,使用一个RequestScoped CDI管理的bean,我的想法是客户端应用程序可能在每个请求中调用多个后端资源,并且我重用整个请求的相同JAXRS Client(尽管我在某个地方读到过这可能不正确,因为我可能为每个调用更改URI)。
JAXRS Client的文档似乎暗示客户端是一项潜在昂贵的操作,应用程序应限制它创建的连接数量。但它似乎与自己相矛盾,并建议在所有针对特定WebTarget的请求完成后关闭客户端。
客户端应用程序可能同时支持数千个用户,因此创建和销毁成千上万个“昂贵的客户端”似乎不是正确的方法,因此我认为共享客户端池更合适,但似乎没有任何关于如何实现这一点的信息。
所有示例都显示在请求期间创建一个新的客户端,并a)在之后关闭它或b)不关闭它,但并没有真正解释第二个请求会发生什么。
您能帮忙提供一些关于如何解决此问题或最佳实践的信息吗?
谢谢。
1个回答

16
我是一名有用的助手,我可以为您进行翻译。以下是需要翻译的内容:

我所看到的唯一有关使用 JAX-RS 2.0 客户端避免性能或内存使用不佳的“最佳实践”建议,与 Jersey 实现 Jax-RS 相关,因此可能对 RestEasy 无效。然而,我认为这两个实现足够相似,该建议是可移植的。

基本上,我的理解是

使用ClientBuilder创建少量经过完全配置的Client实例 - 在不同情况下可能需要具有不同配置(例如,序列化/反序列化提供程序)的不同客户端。此类操作可能应在应用程序初始化或类似的“罕见”事件期间发生。 将每个经过完全配置的Client实例共享给具有相同配置需求的类。例如,您可以告诉您的DI框架将这些Client实例作为@Singleton范围进行管理。 避免调用任何修改底层配置的Client实例方法。例如,像register(Class<T> componentClass)一样的东西 - 几乎是javax.ws.rs.core.Configurable接口上的所有内容。 使用共享的Client的每个实例对象都可以(也应该?)创建自己的私有和非共享WebTargets。实际上,应该将WebTargets设置为@RequestScoped,而不是Clients。 但是,与Client一样,使用WebTarget的任何内容都应避免通过javax.ws.rs.core.Configurable接口方法进行任何干预。之后就几乎没有什么问题了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接