Объединение соединений с помощью HTTPBuilder

У меня есть приложение 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
}

person McMagic    schedule 07.01.2013    source источник


Ответы (1)


У нас была аналогичная проблема с нашим приложением (но только с одним экземпляром клиента). Следующее решение основано на 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
    }
}
person Julien    schedule 08.01.2013
comment
Спасибо, похоже, это потенциально может работать для наших целей. Один вопрос - есть ли причина, по которой вы решили переместить объявление переменной http за пределы вызова функции? Он просто постоянно использует одно и то же соединение? Цените ваш вклад. - person McMagic; 08.01.2013
comment
Вы правы, переменная http определяется только один раз и должна быть объявлена ​​final. Все находится в классе, отмеченном аннотацией @Singleton. - person Julien; 10.01.2013
comment
К сожалению, это все еще не работает для отправки запросов. Нужно ли запускать sendQueueTask с контроллера? Я делаю именно то, что вы написали выше, и не вижу никаких запросов на другом сервере. - person McMagic; 11.01.2013
comment
Я никогда не мог заставить это решение работать. Теперь я рассматриваю возможность отказа от HTTPBuilder и использования простого старого HTTPClient apache, который поддерживает сохранение соединения. - person McMagic; 14.02.2013