我的问题是这样的:
Google App Engine允许cron作业在引发DeadlineExceededException之前仅活动30秒。从这个角度来看,我的应用程序不适合谷歌应用程序引擎平台,需要调用一个耗时的cron作业。
我想到的一个解决方案是调用另一个Servlet(Servlet2)并让Servlet2为我完成工作,Servlet_2将是一个常规的Java Servlet。为实现这一点,我想创建一个{{3}从我的cron作业Servlet_1,调用另一个Servlet_2,测试会话,然后让服务器完成所需的工作,最后使会话无效。
来自Servlet_1的调用不应该重定向到Servlet_2,因为这会让我再次回到正方形。
现在问我的问题:你认为这会有用吗?如果是,并且DeadlineExceededException acure,即使我将所有代码都放在Servlet_2的destroy方法中,Servlet_2也会停止工作吗?
我的代码:
//Servlet_1
try {
HttpSession session = request.getSession(true);
session.setAttribute("referingPage", "server is calling");
request.getRequestDispatcher("/Servlet_2.do").forward(request, response);
}catch(DeadlineExceededException e) {
e.printStackTrace();
}
//Servlet_2
@Override
public void destroy() {
HttpSession session = request.getSession(true);
String value = (String)session.getAttribute("referringPage");
if(value.equals("server is calling")) {
// Do the time demanding stuff
}
session.invalidate();
}
将不胜感激的答案!
答案 0 :(得分:1)
为什么不使用任务队列。你把一个任务放在队列上 - 它工作了29秒然后停止,但是在它停止之前,它将另一个任务放在队列上。只要有效负载有一个标记来指示重新启动的位置,那么只要您想要消耗(并支付)CPU,就可以运行一组链接的任务。
答案 1 :(得分:1)
你只有30秒的时间来完成执行,而且没有办法解决这个问题。执行转发不会产生新的线程或任何东西,它仍然在30秒的时间限制内执行。
我试着找出一些方法来序列化你正在做的事情,或者暂停它并将你的状态保持在memcache中。当您再次开始处理时,请检查内存缓存以查看是否需要从上次停止的地方获取表单。
Google App Engine正在研究长时间运行的后台进程,我希望很快就能找到解决方案。我在同一条船上。
标记