gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:48:55 24 4
gpt4 key购买 nike

给我的问题一点背景......

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

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

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

客户端应用程序可能同时支持数千个用户,因此创建和销毁数千个“昂贵的客户端”似乎不是正确的方法,所以我认为共享客户端池更合适,但似乎没有任何信息说明如何应该做到这一点。

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

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

谢谢。

最佳答案

我唯一的“最佳实践”建议seen使用 JAX-RS 2.0 客户端避免性能不佳或内存使用模式不佳与 Jax-RS 的 Jersey 实现有关,因此它可能对 RestEasy 无效。但是,我怀疑这两个实现足够相似,以至于建议是可移植的。

基本上,我的理解是

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

  • 在那之后,它几乎是一帆风顺的。

    关于rest - 如何正确共享 JAX-RS 2.0 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34566278/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com