我正在使用jersey客户端将POST请求发送到第三方Web服务。由于创建泽西岛客户端非常昂贵,因此我在Spring托管的服务客户端类的构造函数中执行此操作。我的想法是,当我的服务器启动时,Spring将创建我的服务客户端bean,这反过来将导致构造函数被调用,因此我的jersey客户端将被创建一次。只要服务器启动,此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 config xml中像这样对spring进行管理:
<bean id="myClient" class="com.mypackage,MyWebserviceClient"></bean>
myClient
然后将bean注入需要进行服务调用的适当位置。
我的问题
1)如果我的应用程序每小时处理数千个请求,它的效率足以仅用一个jersey客户端处理所有请求。
2)我是否需要某种jersey客户端池,以便更有效地处理大量请求。如果是这样,有办法吗?
3)我通常想知道如何在服务器端处理来自最终用户的多个请求。每个请求是服务器上单独的执行线程,并且所有请求都可以访问相同的jersey客户端对象。如果jersey客户端对象正忙于一个这样的请求,那么来自不同最终用户的其他请求是否要等待直到收到正在进行的请求的响应?
4)我正在使用的任何更好的替代方法。
您的想法是正确的。
1-是,建议重用客户端实例:
来自https://jersey.java.net/documentation/1.18/client-api.html#d4e623:
客户端实例是昂贵的资源。建议将已配置的实例重新用于创建Web资源。Web资源的创建,请求的建立和响应的接收都保证是线程安全的。因此,可以在多个线程之间共享Client实例和WebResource实例。
2-不需要,客户端本身可以处理请求。对于异步请求,它在内部使用可配置的线程池。
3-Jersey客户端是线程安全的,因此线程不会互相阻塞
4-您还可以考虑将客户端作为MyWebserviceClient的依赖项提供,并可能在多个类之间重用同一客户端
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句