我有一个服务类,它有许多方法可以对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()方法,我可以按原样离开它们,只需关闭方法内的资源。
答案 0 :(得分:10)
创建WebResource实例的方法是线程安全的。方法 修改配置和/或过滤器不保证是 线程安全的。
创建客户端实例是一项昂贵的操作 实例可以利用并保留许多资源。因此 建议重新使用客户端实例进行创建 需要相同配置设置的WebResource实例
创建请求和返回响应的方法是线程安全的。 修改过滤器的方法不保证是线程安全的
虽然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;
}