3

我们有两个AppEngine(Java)应用程序。其中一个使用URLFetch来创建约会。在接收器中,我们添加了一项功能,我们使用Channel API来查看是否有任何开放频道,并让他们了解新数据。SocketTimeoutException使用URLFetch发送通道消息的服务

URLFetch调用失败,返回SocketTimeoutException。接收器中的所有代码都被执行(包括被通知的所有开放通道),但调用应用程序仍然会收到SocketTimeoutException。当我注释掉频道通知行时,没有错误。

这只发生在已部署的应用程序中,而不是在开发模式下。另外,这个调用并没有达到URLFetch允许的60秒(甚至是10秒)超时。

+0

我们不可能在没有看到代码和堆栈跟踪的情况下提供帮助。 – 2012-01-13 03:52:10

+0

我会整理一个样本,但我们已经解决了它。不是直接通知通道,而是将请求发送到任务队列。此队列执行相同的操作,但不返回SocketTimeoutException。无论如何,原来只是一个标准的servlet,最后调用ChannelServiceFactory.getChannelService().sendMessage。 – 2012-04-29 12:57:25

+0

它必须是特定于您的应用程序的东西 - 绝对不是不可能从一个应用程序到另一个应用程序进行urlfetch! – 2012-04-30 05:16:32

回答

0

urlfetch的默认截止时间为5秒,所以如果您的应用程序需要超过5秒来加载并执行处理程序,它将返回一个SocketTimeoutException

正如documentation描述,您可以设置一个较长的期限使用setConnectTimeoutsetReadTimeout

除了你的网址抓取调用,它是移动的API调用,可以延迟(即不需要一个好主意建HTTP响应),以一个task queue

  • 截止任务队列请求较长(10分钟,而不是60秒)
  • 任务将如不能
  • 重试
  • urlfetch超时也较长(10分钟)