java - Jersey 客户服务 - 关闭资源

标签 java spring rest jakarta-ee jersey

我有一个服务类,它有许多方法可以对 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/

相关文章:

java - 当我尝试添加 mysql 连接器依赖项时出现错误

java - 在 DropWizard 中使用 REST API

rest - Suave with f# - 如何在 f# 聊天应用程序中使用 rest api 和 websocket 端口?

java - Apache Avro 框架可以在序列化期间处理参数化类型吗?

Java:通过返回供应商与返回新实例来实例化泛型类型

java - Spring CamelContext 无法解析占位符

java - 当 IN 子句超过 100 或 1000 时,NamedParameterJdbcTemplate 不起作用

java - 如何使用变量的值引用变量名称

java - 无法加载 RSA 公钥

java - Spring Data JPA - JpaRepository 中的自定义排序