【问题标题】:Initializing jersey client in constructor of spring managed bean在 Spring 托管 bean 的构造函数中初始化球衣客户端
【发布时间】:2014-03-06 14:50:00
【问题描述】:

我正在使用 jersey 客户端向第三方网络服务发送 POST 请求。由于创建球衣客户端很昂贵,因此我在 Spring 管理的服务客户端类的构造函数中执行此操作。我的想法是,当我的服务器启动时,Spring 将创建我的服务客户端 bean,这反过来会导致构造函数被调用,因此我的球衣客户端将被创建一次。只要服务器启动,这个 jersey 客户端将负责发送请求,并且不需要进一步的客户端初始化。但是,我将为每次通话创建一个新的网络资源,因为创建球衣网络资源要便宜得多。

package com.mypackage;
//Bunch of imports

class MyWebserviceClient {

    //jersey client member variable
    private Client jClient;

    public MyWebserviceClient(){

        //Create jersey client
        jClient = Client.create();

        //Other stuff
    }

    public void sendRequest(){

        WebResource wr = jClient.resource(someUrl);
        //Use the webresource to make webservice call
    }
}

MyWebserviceClient 在 Spring config xml 中是这样管理的:

<bean id="myClient" class="com.mypackage,MyWebserviceClient"></bean>

bean myClient 然后将被注入到需要进行服务调用的适当位置。

我的问题

1) 如果我的应用程序每小时处理数以千计的请求,那么它是否足以通过一个 jersey 客户端来处理所有请求。

2) 我是否需要某种 jersey 客户端池,以便更有效地处理大量请求。如果是这样,有没有办法做到这一点?

3) 我想大致了解如何在服务器端处理来自最终用户的多个请求。每个请求都是服务器上一个单独的执行线程,它们都可以访问同一个 jersey 客户端对象。如果 jersey 客户端对象正忙于处理一个这样的请求,那么来自不同最终用户的其他请求是否会等到收到对正在进行的请求的响应?

4) 任何比我正在使用的更好的替代品。

【问题讨论】:

    标签: java spring web-services jersey jersey-client


    【解决方案1】:

    你的想法是正确的。

    1 - 是,建议重用客户端实例:

    来自https://jersey.java.net/documentation/1.18/client-api.html#d4e623

    客户端实例是昂贵的资源。建议重用已配置的实例来创建 Web 资源。 Web 资源的创建、请求的构建和响应的接收都保证是线程安全的。因此,一个 Client 实例和 WebResource 实例可以在多个线程之间共享。

    2 - 不需要,客户端本身可以处理请求。在异步请求的情况下,它在内部使用可配置的线程池。

    3 - Jersey 客户端是线程安全的,因此线程不会相互阻塞

    4 - 您还可以考虑将客户端作为对 MyWebserviceClient 的依赖项,并可能在多个类之间重用同一个客户端

    【讨论】:

      猜你喜欢
      • 2013-06-08
      • 1970-01-01
      • 2014-09-28
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2012-11-15
      相关资源
      最近更新 更多