5

我有一个服务类,它有许多对 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() 方法,我可以让它们保持原样,只关闭方法内的资源。

4

1 回答 1

12

泽西岛文档

对于客户

创建 WebResource 实例的方法是线程安全的。修改配置和/或过滤器的方法不能保证是线程安全的。

Client 实例的创建是一项昂贵的操作,并且该实例可能会使用并保留许多资源。因此,建议重用 Client 实例来创建需要相同配置设置的 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;
}
于 2013-01-13T17:07:05.173 回答