我正在使用jersey客户端向第三方Web服务发送POST请求。由于创建jersey客户端很昂贵,我在Spring管理的服务客户端类的构造函数中执行此操作。我的想法是,当我的服务器启动时,Spring将创建我的服务客户端bean,这反过来将导致调用构造函数,因此我的jersey客户端将被创建一次。只要服务器启动,此球衣客户端将负责发送请求,并且不需要进一步的客户端初始化。但是,我将为每个调用创建一个新的webresource,因为创建jersey webresources要便宜得多。
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:
<bean id="myClient" class="com.mypackage,MyWebserviceClient"></bean>
然后将bean myClient
注入需要进行服务调用的适当位置。
我的问题
1)如果我的应用程序每小时处理数千个请求,那么只需一个球衣客户端即可处理所有请求。
2)我是否需要某种球衣客户端池,以便更有效地处理大量请求。如果是这样,有办法吗?
3)我想知道如何在服务器端处理来自最终用户的多个请求。每个请求都是服务器上的单独执行线程,并且所有请求都可以访问相同的泽西客户端对象。如果泽西客户端对象忙于一个这样的请求,来自不同最终用户的其他请求是否会等到收到正在进行的请求的响应?
4)任何比我正在使用的更好的替代方案。
答案 0 :(得分:2)
你的想法正确。
1 - 是的,建议重用客户端实例:
来自https://jersey.java.net/documentation/1.18/client-api.html#d4e623:
客户端实例是昂贵的资源。建议重新使用已配置的实例来创建Web资源。 Web资源的创建,请求的构建和响应的接收都保证是线程安全的。因此,可以在多个线程之间共享Client实例和WebResource实例。
2 - 不需要,客户端本身可以处理请求。在异步请求的情况下,它在内部使用可配置的线程池。
3 - Jersey客户端是线程安全的,因此线程不会相互阻塞
4 - 您还可以考虑将客户端作为MyWebserviceClient的依赖项,并可能在多个类之间重用相同的客户端