首页 > 解决方案 > 如何以线程安全的方式在 JAX-RS 资源中使用 JerseyClient

问题描述

在以下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。

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

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

根据文档,初始化主体内部可能很昂贵,从而带来性能问题。JerseyClientcreateUser

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

标签: javamultithreadingjerseyjax-rs

解决方案


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

泽西岛文件说:

客户端实例是昂贵的资源。建议重用已配置的实例来创建 Web 资源。Web 资源的创建、请求的构建和响应的接收都保证是线程安全的。因此,一个 Client 实例和 WebResource 实例可能在多个线程之间共享。


推荐阅读