【问题标题】:DeadlineExceededError workaroundsDeadlineExceededError 解决方法
【发布时间】:2011-03-14 07:24:19
【问题描述】:

我正在制作类似于网络蜘蛛的东西。 它会从 WEB LIST 中捕获我想要的数据。 WEB LIST 的数量约为 20。 每个都可以在 1 到 10 秒左右完成。

我知道DeadlineExceededError 表示我的请求处理程序没有在 30 秒内完成。 我也知道我无法更改 30 秒的限制。

所以我需要把我的工作分成小块,但我不知道该怎么做。

这是我的代码:

    List<String> ids = agent.getWebList();

    if(ids.iterator().hasNext()) {
        for(String id : ids) {
            Data d = agent.getDetailedDataById(id);
            agent.updateData(d);
        }
    }

【问题讨论】:

  • 如果不是 GAE,使用线程并在达到限制之前中断它们将是最好的解决方案。如果不是 GAE……
  • 谢谢,下次可以用一下

标签: java google-app-engine


【解决方案1】:

如果您正在使用网络蜘蛛,最好的方法是使用任务队列:

Java Task Queue docs

Python Task Queue docs

【讨论】:

  • 我同意,为了便于参考,因为这是一个 Java 问题,这里是 Java 任务队列概述:code.google.com/appengine/docs/java/taskqueue/overview.html
  • 从 API 1.4.0 开始,任务队列的时间限制为 10 分钟。
  • @Travis Webb ,一个任务的限制不是吗?在这种情况下,网址来自 WEB LIST。因为它只需要大约 1 到 10 秒,我认为就可以了。
  • 我知道我为什么想念它。谷歌不翻译中文谷歌文档。我会试试的,谢谢。
【解决方案2】:

在遍历您的 id 时,请保留一个计数器。当您捕获 DeadLineExceededError 时,将计数器作为参数传递给从该位置开始处理的任务。这将按顺序进行。您还可以拆分工作并分配给多个任务同时处理。

【讨论】:

    【解决方案3】:

    引发了两个DeadlineExceededErrors。您可以在第一时间捕捉到它,并整理好您的状态,以便稍后再次继续或为下一阶段生成任务。

    你第二次抓不到DeadlineExceededError

    【讨论】:

    • 您能解释一下什么是“引发了两个 DeadlineExceededErrors”。或者我错过了文件上我应该知道的一些内容。谢谢。
    • 如果您使用执行时间为 10 分钟的任务队列,则在 10 分钟左右会抛出第一个超出期限的错误(软),可以捕获。第二个是硬期限限制,不能被捕获,你的任务被 GAE 终止。
    • 感谢您的清晰解释。我想我可以通过这些方式完成它。
    猜你喜欢
    • 2012-02-22
    • 2018-06-01
    • 1970-01-01
    • 2023-03-13
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2013-12-21
    相关资源
    最近更新 更多