使用Spring RestTemplate调用客户端休息调用,是否可以限制这些调用? 例如。最多10个并发呼叫。
RestTemplate本身似乎没有提供这个,所以我想知道选项是什么。
最好有一个通用的解决方案,例如也限制了SOAP调用。
答案 0 :(得分:1)
要创建RestTemplate的实例,您只需调用默认值即可 no-arg构造函数。这将使用来自的标准Java类 java.net包作为创建HTTP的底层实现 要求。这可以通过指定实现来覆盖 ClientHttpRequestFactory。 Spring提供了实现 使用Apache的HttpComponentsClientHttpRequestFactory HttpComponents HttpClient创建请求。 使用实例配置HttpComponentsClientHttpRequestFactory 可以依次配置org.apache.http.client.HttpClient 凭证信息或连接池功能。
我希望配置RestTemplate以使用HTTP组件并与setMaxPerRoute和setMaxTotal一起玩。如果您的SOAP客户端also happens to be using HTTP Components可能有一种方法可以在两者之间共享Commons HTTP Components设置。
另一种选择是自己动手。您可以创建Proxy使用Semaphore来阻止,直到另一个请求完成。这些内容(注意这段代码完全没有经过测试,只是为了传达你如何实现这一点的一般概念):
public class GenericCounterProxy implements InvocationHandler
{
private final Object target;
private final int maxConcurrent;
private final Semaphore sem;
GenericCounterProxy(Object target, int maxConcurrent)
{
this.target = target;
this.maxConcurrent = maxConcurrent;
this.sem = new Semaphore(maxConcurrent, true);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try
{
// block until acquire succeeds
sem.acquire()
method.invoke(target, args);
}
finally
{
// release the Semaphore no matter what.
sem.release();
}
}
public static <T> T proxy(T target, int maxConcurrent)
{
InvocationHandler handler = new GenericCounterProxy(target, maxConcurrent);
return (T) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);
}
}
如果你想采用这种方法: