2

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 pool-3-thread-1 pool-3-thread-1 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 pool-3-thread-1 pool-3-thread-1

4

2 に答える 2

3

バグを修正し、新しい0.5.2-SNAPSHOTをデプロイしました。そのため、最新のスナップショットで動作するようになります。

この修正と他の多くのバグの修正を含む0.5.2finalをまもなくリリースする予定です。

記録として、名前付きパラメーターは実際にはそうではpoolSizeありませんpoolsizeが、それが問題の原因ではありません。(しかし、これは0.5.2で修正する予定です-http ://jira.codehaus.org/browse/GMOD-175。)

バグを報告してくれたTimYatesに感謝します。

于 2011-03-10T00:14:00.093 に答える
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までに修正されます(または、なぜ間違っているのかがわかります)。

于 2011-03-08T10:44:03.417 に答える