【问题标题】:Jersey client creation in a REST service在 REST 服务中创建 Jersey 客户端
【发布时间】:2014-03-10 16:30:07
【问题描述】:

我正在创建一个使用其他 http REST 服务的 http REST 服务。

我正在使用 Jersey 客户端调用其他服务,我对 http 客户端的哪种创建模式最好有很多疑问。

目前我正在使用 EJB 注入客户端,该客户端是每个方法共享的单例,但我想删除 java ee 依赖项并将 Jetty 用作嵌入式应用程序服务器。

我从the doc 看到,创建客户端是一项昂贵的操作,所以我无法在每次需要时都创建一个。

我认为在每个 Servlet/Rest 类的构造函数中创建 1 是更简单的解决方案,但我不确定 servlet 的生命周期(如果为每个请求创建一个实例,则此方法与上一个)

或者最好创建一个由每个 Servlet/Rest 类共享的 Singleton

或者也许更好的 N 个客户端池。

关于这最后两个解决方案,我需要一些建议...您认为哪种解决方案更好?

谢谢

【问题讨论】:

  • 我对目前的答案不是很满意,因为他们解释了如何做,但问题更多的是哪个是更好的选择

标签: java web-services rest servlets design-patterns


【解决方案1】:

根据您的说法,在某个环境中部署了一个REST Service,并且有一个应用程序,一个clientconsumer,它想要访问该服务。

如果我使用 Jersey API 编写普通的Java class 作为客户端,那么我会写一些这样的东西:

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

Client client = Client.create(); 
WebResource webResource = client
       .resource("http://localhost:8080/rest/example/employees");

ClientResponse response = webResource.accept("application/json")
               .get(ClientResponse.class);
String result = response.getEntity(String.class);

现在说你正在编写一个servlet,它在你的应用程序中完成一些定义的工作,它还使用客户端代码块调用REST Service,每次你访问servlet它都会创建一个实例com.sun.jersey.api.client.Client 每次。

如果您想避免这种情况,那么您可以创建一个初始类,该类将创建一个唯一的com.sun.jersey.api.client.Client 实例,并将其设为静态并在您想要的任何地方使用相同的引用。 WebResource 应在需要时创建,因为您可能有兴趣调用不同的 URIs

如果我处于你的情况,我会采用这种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多