我有一个服务类,它有许多方法可以对 Spring REST 服务进行 REST 调用。 每个方法如下所示:
public void getUser() {
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(RESOURCE_URL);
// Get response as String
String response = service.path("/addUser").accept(MediaType.TEXT_PLAIN)
.get(String.class);
return response;
}
以上工作正常,但我有点担心每次调用该方法时,都会创建 ClientConfig、Client 和 WebResource 的新实例。如果我更改上述内容并将 ClientConfig、Client 和 WebResource 作为类级实例变量,会有什么副作用?即更改为:
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(RESOURCE_URL);
public void getUser() {
// Get response as String
String response = service.path("/addUser").accept(MediaType.TEXT_PLAIN)
.get(String.class);
return response;
}
public void getUserAccount() {
// Get response as String
String response = service.path("/getUserAccount").accept(MediaType.TEXT_PLAIN)
.get(String.class);
return response;
}
如果多个用户同时调用不同的方法,上面是否有可能失败?构建上述内容的最佳方式是什么?
如果 Jersey 客户端方法有 close() 方法,我可以让它们保持原样并关闭方法内的资源。
最佳答案
来自 Jersey documentation :
对于 Client :
Methods to create instances of WebResource are thread-safe. Methods that modify configuration and or filters are not guaranteed to be thread-safe.
The creation of a Client instance is an expensive operation and the instance may make use of and retain many resources. It is therefore recommended that a Client instance is reused for the creation of WebResource instances that require the same configuration settings
对于 WebResource :
Methods to create a request and return a response are thread-safe. Methods that modify filters are not guaranteed to be thread-safe
虽然 ClientConfig
没有明确的并发文档,但从其源代码可以清楚地看出它可以在多线程环境中安全使用。 Client
类也是线程安全的,只需要考虑 WebResource
。根据它的文档,我会为每个线程分配一个新的 WebResource
,这意味着您的代码应该看起来更像这样:
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
public void getUser() {
WebResource service = client.resource(RESOURCE_URL);
// Get response as String
String response = service
.path("/addUser")
.accept(MediaType.TEXT_PLAIN)
.get(String.class);
return response;
}
关于java - Jersey 客户服务 - 关闭资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14305655/