首页 文章

Jersey 客户服务 - 关闭资源

提问于
浏览
4

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

1 回答

  • 10

    来自Jersey documentation

    对于Client

    创建WebResource实例的方法是线程安全的 . 修改配置和/或过滤器的方法不保证是线程安全的 . 创建客户端实例是一项昂贵的操作,实例可能会使用并保留许多资源 . 因此,建议重新使用Client实例来创建需要相同配置设置的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;
    }
    

相关问题