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

How to correctly share JAX-RS 2.0 client

为我的问题提供一些背景...

我有一个 Java EE Web 应用程序(作为 UI / 客户端),它使用 JAX-RS 2.0 客户端通过 REST 接口访问数据/业务逻辑服务 API(Resteasy 实现)。

目前我使用 RequestScoped CDI 托管 bean 为每个请求注入一个新的 JAXRS 客户端实例,我的想法是客户端应用程序可以为每个请求调用多个后端资源并且我为整个请求重用相同的 JAXRS 客户端(尽管我在某处阅读这可能不正确,因为我可能会为每次调用更改 URI)

JAXRS 客户端的文档似乎表明客户端是一个可能很昂贵的操作,应用程序应该限制它创建的连接数量。它似乎也自相矛盾,并建议一旦对特定 WebTarget 的所有请求都完成,就应该关闭客户端。

客户端应用程序可能会同时支持数千个用户,因此创建和销毁数千个 'expensive clients' 似乎不是正确的方法,因此我认为共享客户端池更合适,但似乎没有是关于如何实现这一目标的任何信息。

所有示例似乎都显示为请求创建一个新客户端,并且 a) 在之后关闭它或 b) 不关闭它但没有真正解释第二次请求时发生的情况。

您能否就您认为如何解决这个问题提供一些答案,或者提供有关此方法的最佳实践的信息。

谢谢。

seen 关于避免 JAX-RS 2.0 客户端性能不佳或内存使用模式不佳的唯一 "best-practice" 建议与 [=38= 的 Jersey 实现有关] 所以它可能对 RestEasy 无效。但是,我怀疑这两个实现非常相似,建议可以移植。

基本上我的理解是

  • 使用 ClientBuilder 创建少量 fully-configured 个客户端实例 - 在不同情况下您可能需要具有不同配置的不同客户端(例如 Serialisation/Deserialisation 提供程序)。这种事情应该发生在应用程序初始化或类似的 'rare' 事件中。
  • 在具有相同配置要求的 类 之间共享每个 fully-configured 客户端实例。例如,您可能会告诉您的 DI 框架将每个 Client 实例的范围限定为 @Singleton.
  • 避免在 Client 实例上调用任何修改底层配置的方法。例如 register(Class<T> componentClass) - javax.ws.rs.core.Configurable 界面上的几乎所有内容。
  • 使用共享客户端的每个实例 object 可以(并且应该?)创建自己的、私有的和 non-shared、WebTargets。实际上,WebTargets 应该是 @RequestScoped 而不是 Clients.
  • 但是,与客户端一样,任何使用 WebTarget 的东西都应该避免通过 javax.ws.rs.core.Configurable 接口方法进行任何欺骗。

之后就是一帆风顺了。