“获取时超时” URLFetch GAE/J

Posted

技术标签:

【中文标题】“获取时超时” URLFetch GAE/J【英文标题】:"Timeout while fetching" URLFetch GAE/J 【发布时间】:2011-05-06 16:45:52 【问题描述】:

我正在使用 XMLReader 来简单地阅读如下所示的提要。

URLConnection urlConnection = url.openConnection(); 
XmlReader reader = new XmlReader(urlConnection); 

当这被调用时,我会在 5 秒内收到一个 IOException "Timeout 获取时”。所以我尝试将超时设置为最大值(10 秒),但仍然没有运气,5 秒后仍然是 IOExeption。

urlConnection.setConnectTimeout(10000); 

(最大值在文档中说明:http://code.google.com/intl/nl-NL/appengine/docs/java/urlfetch/overview.html

Feed 的大小似乎太大了。当我调用较小的提要时 它工作正常。有什么解决方法或解决方案吗?我需要能够调用更大的提要。

【问题讨论】:

【参考方案1】:

您应该使用设置读取截止日期的setReadTimeout 方法:

urlConnection.setReadTimeout(10000); //10 Sec

您应该能够在 10 秒内下载更大的 Feed。 如果您仍然有问题,请尝试使用 this 不同的方法。

【讨论】:

感谢您的快速回复。我试过了,不幸的是还是一样的异常。似乎在 5 秒内完全没有响应。 @Ben 对我来说听起来很奇怪;例如,通过浏览器获取此提要需要多少秒? 大约需要 10 秒。在浏览器中(FireFox/Chrome/IE) @Ben 哇,那是脂肪饲料。如果服务器支持“范围请求”,您可以尝试异步获取较小的提要块;我不知道它是否适合这种数据。 我试试,谢谢。虽然,我仍然觉得很奇怪,超时时间不受 setConnectionTimeout 或 setReadTimeout 的影响。【参考方案2】:

原因是:

如果在读取超时期间没有可用数据,则可以抛出异常。来自the doc of Oracle

如果在数据可供读取之前读取超时到期,则从返回的输入流读取时可能会引发 SocketTimeoutException。

顺便说一下,ReadTimeoutConnectTimeout不同,读超时是从主机获取数据的超时时间,见different connection timeout and read timeout

所以作为@systempuntoout 的回答,需要设置读取超时。

【讨论】:

以上是关于“获取时超时” URLFetch GAE/J的主要内容,如果未能解决你的问题,请参考以下文章

触发函数时无法 UrlFetch

使用 Java 设置 GTalk 状态 - GAE/J

Eclipse 需要哪些 JAR 文件才能使用 JSTL 才能最终在 GAE/J 上运行?

Jenkins 在 10 分钟内从 Github 获取时超时。

使用 Google AppEngine Urlfetch 代替 urllib2

当 URL 包含空格时,为啥 urlfetch 会得到 status:400?