1

我有一个 Grails/Groovy 应用程序,它使用 HTTPBuilder 库来调用我们的应用程序服务器。随着资源利用率的提高,我们正在寻找一种方法来池化我们的 HTTP 连接。我发现的唯一支持池的 HTTPBuilder 版本是 AsyncHTTPBuilder,但我们的调用必须同步进行。有没有人有使用 HTTPBuilder 池连接的经验,或者是否有一个备用库我们应该使用池连接来发出我们的请求?

这是我们使用 HTTPBuilder 库的示例:

def get(event, request) {    
    def http = new HTTPBuilder(appServerURL)
    def result = ""
    http.client.cookieStore.addCookie
    sessionHolderService.getVPMClientUser().apiSessionCookie
    http.request(GET, TEXT) {
        uri.path = "/path/on/appserver"
        uri.query = [event: event, request: request, responseFormat: 'text/xml']

        response.success = { resp, text ->
            result = text.text                
        }

        response.failure = { resp, text ->
            result = text.text
            throw new VPMClientException(resp.status, resp.message, text.text)
        }
    }
    result
}
4

1 回答 1

0

我们的应用程序也有类似的问题(但仅限于一个客户端实例)。以下解决方案基于 Gpars。这些操作被放入发送队列,然后由任务使用。

final def http = ...

final DataflowQueue sendQueue = new DataflowQueue()
final DataflowVariable finished = new DataflowVariable<Boolean>()

def sendQueueTask = task {
    while(!finished.isBound()){
            def sendAction = sendQueue.getVal(1, TimeUnit.SECONDS)
            if(sendAction)
                  sendAction()
        }
}

然后将操作包装在 sendQueue 中添加的闭包中:

def get(event, request) { 
  sendQueue << {
       // your get implementation
    }
}
于 2013-01-08T11:17:31.380 回答