Groovy:Codehaus中RESTClient类的多线程使用

时间:2014-07-02 13:44:17

标签: multithreading groovy rest-client

我在我的应用程序中使用Codehaus(http://groovy.codehaus.org/modules/http-builder/apidocs/index.html?groovyx/net/http/RESTClient.html)中的RESTClient类,但是,当多个线程同时尝试使用客户端时,我遇到了问题。经过一些阅读后我发现这是因为默认情况下RESTClient类使用的是一个无法由多个线程共享的连接。答案似乎是使用一个允许从多个线程并发使用的不同连接类(如下所述:Groovy RestClient with many connections)。但是,我似乎无法在任何地方找到如何告诉RESTClient类使用这些其他类型的连接。这甚至可能吗?我希望保留RESTClient的优势,因此只使用通用的HTTPBuilder或AsyncHTTPBuilder类而不是RESTClient类会破坏RESTClient类的目的(除非它可以使用HTTPBuiler / AsyncHTTPBuilder) class吐出一个RESTClient连接。)

或者,我应该为每个线程创建一个新的RESTClient吗?

2 个答案:

答案 0 :(得分:4)

以下是HttpBuilder子类的一些代码,它将为ThreadSafeHTTPBuilder的单个实例创建一个线程安全的客户端连接池。

import groovyx.net.http.HTTPBuilder
import org.apache.http.impl.client.AbstractHttpClient
import org.apache.http.impl.client.DefaultHttpClient
import org.apache.http.impl.conn.PoolingClientConnectionManager
import org.apache.http.params.HttpParams

class ThreadSafeHTTPBuilder extends HTTPBuilder {

    protected AbstractHttpClient createClient(HttpParams params) {
        PoolingClientConnectionManager cm = new PoolingClientConnectionManager()
        cm.setMaxTotal(200) // Increase max total connection to 200
        cm.setDefaultMaxPerRoute(20) // Increase default max connection per route to 20
        new DefaultHttpClient(cm, params)
    }
}

用法:

def client = new ThreadSafeHTTPBuilder()

答案 1 :(得分:0)

  

或者,我应该为每个线程创建一个新的RESTClient吗?

是的,这是最简单的方法