【问题标题】:How to use JerseyClient in a JAX-RS resource in thread-safe manner如何以线程安全的方式在 JAX-RS 资源中使用 JerseyClient
【发布时间】:2019-10-04 02:54:36
【问题描述】:

在以下UserResource类中:

public class UserResource {
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/users")
    public void createUser() {
        //JerseyClient is needed to send a REST request to another RESTful service
    }
}

JerseyClient 需要向评论中提到的另一个 RESTful API 发送请求。

由于同时可能有多个线程调用此UserResource,JerseyClient 可能应该在每个线程的每个调用中初始化以保证线程安全。但是,提到的JAX-RS Client

客户端是管理客户端通信基础架构的重量级对象。 Client 实例的初始化和处置可能是一项相当昂贵的操作。因此建议在应用程序中只构建少量的客户端实例。客户端实例在被释放之前必须正确关闭,以避免资源泄漏。

根据文档,在createUser主体内初始化JerseyClient可能昂贵,从而带来性能问题。

问题:如何以线程安全的方式高效优化JerseyClient实例的数量?

【问题讨论】:

    标签: java multithreading jersey jax-rs


    【解决方案1】:

    如果您将Client 实例化为类字段就足够了,因为Client 类是线程安全的。

    Jersey documentation 说:

    客户端实例是昂贵的资源。推荐一个 配置的实例被重用于 Web 的创建 资源。网络资源的创建,网络资源的建设 请求和接收响应保证是线程 安全的。因此可以共享一个 Client 实例和 WebResource 实例 多个线程之间。

    【讨论】:

    • 不要尝试从不同的线程重新配置客户端。而是配置您从客户端获得的 WebTargets。并且客户端上永远不会改变的配置可以留在客户端上。配置,意味着属性的设置和提供者的注册。这些不能在 bot 客户端和 WebTarget 上。
    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    相关资源
    最近更新 更多