在spring托管bean的构造函数中初始化jersey客户端



我正在使用jersey客户端向第三方Web服务发送POST请求。由于创建jersey客户端的成本很高,所以我在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配置xml:中是这样进行spring管理的

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

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

我的问题

1) 如果我的应用程序每小时处理数千个请求,那么仅用一个jersey客户端处理所有请求是否足够高效。

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

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

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

你的想法是正确的。

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

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

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

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

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

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

最新更新