Groovy AsyncHTTPBuilder не выполняет запрос асинхронно - PullRequest
2 голосов
/ 08 марта 2011

Я играю с AsyncHTTPBuilder (v0.5.1), однако, я не могу заставить его работать, поэтому он выполняет запросы асинхронно.Пожалуйста, проверьте код ниже.Похоже, все запросы выполняются из одного потока:

@Test public void testPoolsizeAndQueueing() {
def http = new AsyncHTTPBuilder( poolSize : 5 ,
                                 uri : 'http://ajax.googleapis.com/ajax/services/search/web' )

def responses = []
/* With one thread in the pool, responses will be sequential but should
 * queue up w/o being rejected. */
10.times {
responses << http.get( query : [q:'Groovy', v:'1.0'] ) { return Thread.currentThread().name }
responses << http.get( query : [q:'Ruby', v:'1.0'] )  { return Thread.currentThread().name }
responses << http.get( query : [q:'Scala', v:'1.0'] )  { return Thread.currentThread().name }
}
def timeout = 60000
def time = 0
while ( true ) {
    if ( responses.every{ it.done ? it.get() : 0 } ) break
    print '.'
    Thread.sleep 2000
    time += 2000
if ( time > timeout ) assert false
}
responses.each { println it.get() }
http.shutdown()
}

Вывод: ..pool-3-thread-1 pool-3-thread-1 pool-3-thread-1 pool-3-thread-1 пул-3-нить-1 пул-3-нить-1 пул-3-нить-1 пул-3-нить-1 пул-3-нить-1 пул-3-нить-1 пул-3-нить-1 pool-3-thread-1 pool-3-thread-1 pool-3-thread-1 pool-3-thread-1 pool-3-thread-1 pool-3-thread-1 пул-3-thread-1pool-3-thread-1 pool-3-thread-1 pool-3-thread-1 pool-3-thread-1 pool-3-thread-1 pool-3-thread-1 пул-3-thread-1 пул-3-thread-1 pool-3-thread-1 pool-3-thread-1 pool-3-thread-1 pool-3-thread-1

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Я исправил ошибку и развернул новый 0.5.2-SNAPSHOT. Так что теперь он будет работать с последним снимком.

Я планирую выпустить финальную версию 0.5.2 с этим исправлением и исправлением ряда других ошибок.

Для записи, указанный параметр на самом деле poolSize не poolsize, но это не является причиной проблемы. (Но это то, что я планирую исправить в 0.5.2 - http://jira.codehaus.org/browse/GMOD-175.)

Спасибо Тиму Йейтсу за сообщение об ошибке.

2 голосов
/ 08 марта 2011

Я полагаю, что это как ожидалось.

Запросы выполняются в отдельных потоках асинхронно, но закрытие { return Thread.currentThread().name } запускается при вызове it.get()(в том же потоке, что и основной скрипт)

Надеюсь, это объясняет это

РЕДАКТИРОВАТЬ

Вы правы.

Запуск с

def http = new AsyncHTTPBuilder( poolsize:5,
                                 uri:'http://ajax.googleapis.com/ajax/services/search/web' )

не работает должным образом ... и изменение его на:

def http = new AsyncHTTPBuilder( threadPool:java.util.concurrent.Executors.newFixedThreadPool( 5 ),
                                 uri:'http://ajax.googleapis.com/ajax/services/search/web' )

заставляет его работать.Даже попробовал с 0.5.2-SNAPSHOT, но получил ту же проблему

Я сообщил об этом как об ошибке: http://jira.codehaus.org/browse/GMOD-174

Скрещенные пальцы это исправят (или мы узнаемпочему мы делаем это неправильно) v 0.5.2

...