2011-09-13 21 views
4

在groovy中,有没有办法将请求发送到URL,忽略响应?主要目标是在更短的时间内向服务器发送更多请求。Groovy:向URL发送请求,忽略结果

结果对我来说并不重要,一旦发送请求,我不希望脚本在继续之前等待响应。

这里是我当前的脚本:

(1..50).each { element-> 
    def url = "http://someUrl" 
    url.toURL().text 
} 

在这段代码中,text方法加载整个响应,我真的不关心。重要的部分是发送请求,等待响应不重要。

有没有类似的send方法? (沿线的..

url.toURL().send 

另外,有一个“常规”的方式,我可以用GPARS并行运行的循环加快这?

回答

6

对于刚刚发送的网址,你可以只使用withInputStreamwithReader的方法来发送请求没有阅读的文字。这将只需创建一个处理程序来读取,将立即关闭。

至于GPars,你可以使用的withPoolcallAysnc的组合,将传入的文本创建一个线程池来执行请求concurren TLY。例如:

@Grab(group='org.codehaus.gpars', module='gpars', version='0.12') 
import static groovyx.gpars.GParsExecutorsPool.withPool 

withPool(50) { 
    50.times { 
     Closure callUrl = {"http://google.com".toURL().withReader {}} 
     callUrl.callAsync(); 
    } 
} 

但是,如果您不关心线程数量,则可以在不使用GPars的情况下创建自己的线程。例如:

50.times { 
    Closure callUrl = {"http://google.com".toURL().withReader {}} 
    Thread.start callUrl 
} 
+0

几个很好的例子 - 非常感谢! –

+2

我不确定,但不会保留50个开放连接吗?不会'Closure callUrl = {“http://google.com”.toURL().withReader {}}'更好,因为它也关闭连接? –

+0

优秀点蒂姆。我已经相应地改变了我的例子。虽然在这种情况下,由于没有对'Reader'对象的未完成引用,当对象被GCed时连接将被关闭。但是,这可能会在JVM决定收集这些对象之前保持很多连接。 –