限制RestTemplate调用

时间:2014-09-23 20:11:05

标签: spring

使用Spring RestTemplate调用客户端休息调用,是否可以限制这些调用? 例如。最多10个并发呼叫。

RestTemplate本身似乎没有提供这个,所以我想知道选项是什么。

最好有一个通用的解决方案,例如也限制了SOAP调用。

1 个答案:

答案 0 :(得分:1)

From the docs

  

要创建RestTemplate的实例,您只需调用默认值即可   no-arg构造函数。这将使用来自的标准Java类   java.net包作为创建HTTP的底层实现   要求。这可以通过指定实现来覆盖   ClientHttpRequestFactory。 Spring提供了实现   使用Apache的HttpComponentsClientHttpRequestFactory   HttpComponents HttpClient创建请求。   使用实例配置HttpComponentsClientHttpRequestFactory   可以依次配置org.apache.http.client.HttpClient   凭证信息或连接池功能。

我希望配置RestTemplate以使用HTTP组件并与setMaxPerRoutesetMaxTotal一起玩。如果您的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);
    }
}

如果你想采用这种方法:

  • 您可能应该优化代理获取信号量的方法,因为并非目标上的每个方法都会受到限制(例如,设置的getter)。
  • 您需要从RestTemplate更改为RestOperations这是一个接口或更改代理机制以使用基于类的代理。