java - 如何以线程安全的方式在 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 实例的初始化和处置可能是一项相当昂贵的操作。因此建议在应用程序中只构建少量的客户端实例。客户端实例必须在被处理之前正确关闭,以避免资源泄漏。
根据文档,初始化主体内部可能很昂贵,从而带来性能问题。JerseyClient
createUser
问题:如何以JerseyClient
线程安全的方式有效地优化实例数量?
解决方案
如果您将您的实例Client
化为类字段就足够了,因为Client
该类是线程安全的。
泽西岛文件说:
客户端实例是昂贵的资源。建议重用已配置的实例来创建 Web 资源。Web 资源的创建、请求的构建和响应的接收都保证是线程安全的。因此,一个 Client 实例和 WebResource 实例可能在多个线程之间共享。
推荐阅读
- c# - 如何在 C# 中从远程获取面板屏幕
- c# - 无法从程序集“Firebase,版本=1.0.0.0,文化=中性,PublicKeyToken=null”加载类型“Firebase.Database.FirebaseObject`1”
- java - 数组中项目的比率总是返回零 ~ HackerRank Plus Minus Problem
- sails.js - 想在 mongodb 的水线中使用 _id 而不是 id
- javascript - 如何在正斜杠前添加字符串?
- python - 当 DEBUG = True 时如何更改 Bulk log 消息?
- html - 无法在表格上添加表格按钮行
- php - PHP如何使用where in替换mysql中的左连接?
- c++ - 任务按处理时间排序时,openMp动态调度和LPT调度一样吗?
- javascript - 使用 charAt() 的文本分类不起作用