当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何正确共享JAX-RS2.0客户端》经验,为你挑选了1个好方法。

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

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

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

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

客户端应用程序可能会支持数千个并发用户,因此创建和销毁数千个"昂贵客户端"似乎不是正确的方法,所以我认为共享客户端池更合适但似乎没有任何关于如何这应该实现.

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

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

谢谢.



1> sisyphus..:

我唯一的"最佳实践"的建议见过避免了JAX-RS 2.0客户端,也表现较差或很差的内存使用模式涉及泽西实现JAX-RS的,所以它可能不是有效的RestEasy的.但是,我怀疑这两个实现是相似的,以至于建议是可移植的.

基本上,我的理解是

使用ClientBuilder创建少量完全配置的客户端实例 - 在不同情况下,您可能需要具有不同配置的不同客户端(例如,序列化/反序列化提供程序).这种事情应该围绕应用程序初始化或类似的"罕见"事件发生.

在具有相同配置要求的类之间共享每个完全配置的客户端实例.例如,您可以告诉您的DI框架将每个客户端实例作为范围@Singleton.

避免调用修改底层配置的客户端实例上的任何方法.例子就是register(Class componentClass)- javax.ws.rs.core.Configurable界面上几乎任何东西.

使用共享客户端的每个实例对象都可以(并且应该)创建自己的私有和非共享WebTargets.实际上,它应该是WebTargets @RequestScoped而不是客户端.

但是,与Client一样,任何使用WebTarget的东西都应该避免通过javax.ws.rs.core.Configurable接口方法进行任何操作.

之后,它几乎是一帆风顺的.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有