如果在JAX-RS资源中使用单例javax.ws.rs.client.Client线程安全吗?

时间:2019-08-31 04:05:18

标签: java concurrency jersey thread-safety jax-rs

在我们现有的代码库中,由于JAX-RX Client API document

  

客户端是管理客户端通信基础结构的重量级对象。初始化和处置Client实例可能是一个相当昂贵的操作。因此,建议在应用程序中仅构造少量的Client实例。

javax.ws.rs.client.Client用作资源内的单例。代码如下:

@Path("test")
public class TestResource {
    private Client client = ClientUtil.getInstance();//Get the singleton Client instance
    @PUT
    @Produces("application/json")
    public String update(@Context UriInfo uri,
    @Context HttpHeaders headers) {
        ...client is used for sending request to some other service
    }
}

问题: TestSource不是由单个用户而是多个用户使用的,并且每个用户都使用自己的凭据,这意味着每个用户都有自己的配置。在任何情况下都必须调用以下方法链:

client.getTarget()
    .request()
    .header(HttpHeaders.AUTHORIZATION, "authorization header value")
    ....

=>并发问题

问题1:代码中的javax.ws.rs.client.Client实例是线程安全的吗?**问题2:如果不是线程安全的,如何解决线程安全问题?我是否应该同步此Singleton Client实例?还是尝试使每个用户拥有自己的Client实例并将其维护在线程安全的集合中?还是有更好的替代解决方案?

0 个答案:

没有答案