我正在玩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-线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池3线程1 池-3-线程1
答案 0 :(得分:2)
我相信这是预期的。
查询正在异步运行在不同的线程中,但 { 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
答案 1 :(得分:2)
我已经修复了这个bug并部署了一个新的0.5.2-SNAPSHOT。因此它现在可以使用最新的快照。
我打算用这个修补程序发布0.5.2 final,并很快修复其他一些bug。
对于记录,命名参数实际上是poolSize
而不是poolsize
,但这不是问题的原因。 (但这是我计划在0.5.2中修复的问题 - http://jira.codehaus.org/browse/GMOD-175。)
感谢Tim Yates报告错误。