2011-03-14 1511 views
1

我正在制作网络蜘蛛。 它会捕捉我想要的数据形式的WEB列表。 WEB列表的数量约为20个。 每个都可以在1到10秒左右完成。DeadlineExceededError解决方法

我知道DeadlineExceededError意味着我的请求处理程序在30秒内没有完成。 我也知道我不能改变30秒的限制。

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

这里是我的代码:

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

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

如果不是GAE,使用线程并在达到极限之前中断它们将是最好的解决方案。如果它不是GAE ... – 2011-03-14 07:27:48

+0

谢谢,也许我可以在下次使用它 – cht 2011-03-14 09:13:32

回答

3

如果你在一个网络蜘蛛工作的最好方式是使用任务队列:

Java Task Queue docs

Python Task Queue docs

+0

我同意,为了便于参考,因为这是一个Java问题,下面是Java概述的任务队列:http://code.google.com/appengine/docs/java/taskqueue/overview.html – Brummo 2011-03-14 12:55:22

+0

时间限制对于任务队列,截至API 1.4.0为10分钟。 – 2011-03-14 17:13:11

+0

@ Travis Webb,限制是一个任务不是吗?在这个场景中来自WEB列表的URL。因为它只需要1到10秒左右就可以了。 – pahan 2011-03-15 05:36:35

0

两个DeadlineExceededError s的提高。你可以在第一时间捕捉到它,并整理好你的状态,以便以后再继续或为下一阶段产生一个任务。

你不能第二次赶上DeadlineExceededError

+0

你能解释什么是“Two DeadlineExceededErrors are raised”。 或者我错过了我应该在文档上知道的东西。谢谢。 – cht 2011-03-14 09:14:43

+0

如果您正在使用执行时间为10分钟的任务队列,则第一个超时错误(软)会在10分钟左右被抛出,可以被捕获。 第二个是严格的截止日期限制,不能被捕获,并且你的任务被GAE终止。 – Sam 2011-03-14 12:46:22

+0

感谢您的明确解释。我想我可以用这种方式来完成它。 – cht 2011-03-15 11:45:20

2

在遍历你的IDS,保留一个计数器。当你捕捉到DeadLineExceededError时,将计数器作为参数传递给从该位置开始处理的任务。这将按顺序完成。您也可以拆分作业,并同时处理几个任务以进行处理。

+0

谢谢!它真的很有帮助。 – cht 2011-03-15 11:51:22