我在Google Appengine应用程序的后端实例中运行了一个长任务(大约6个小时)。
这是后端配置:
<backend name="backend_1">
<class>B4_1G</class>
<options>
<public>true</public>
<dynamic>false</dynamic>
</options>
</backend>
当进程正在运行时(在默认线程或并行线程中,我尝试了两个)我随机获取了一段时间后
2013-09-13 18:52:14.677
Process terminated because the backend took too long to shutdown.
我环顾四周寻找解决方案,我读到了我实施的shutdown Hook for Backend instance,但它似乎没有起作用。
LifecycleManager.getInstance().setShutdownHook(new ShutdownHook()
{
public void shutdown()
{
log().info("Shutting down...");
LifecycleManager.getInstance().interruptAllRequests();
}
});
永远不会显示日志消息,只显示Process terminated because...
消息
我还实现了isShuttingDown检查
LifecycleManager.getInstance().isShuttingDown();
在我的流程的每个周期中,我检查的第一件事是后端是否正在关闭,但这个标志永远不会成立。
这个过程总是“残酷地”中断,没有任何钩子来控制关机(也许我可以停止操作,保存一些数据以备将来恢复)
我想到了“内存不足”错误,但我没有在内存中存储任何“大”对象。此外,在每个循环中,实例变量都设置为NULL,从而强制释放内存。
另外,我期待像这样的错误
Uncaught exception from servlet java.lang.OutOfMemoryError: Java heap space
如果这是问题
我是唯一遇到此类问题的人吗?
已经阅读this article,但没有解决方案
答案 0 :(得分:0)
我遇到了与python相同的问题。就我而言,我看到的只是终止的消息。检查时cpu,内存使用情况都没问题。从来没有那么简介并且降低了内存消耗。仍然看到同样的事情。在你的情况下它说内存问题,你可以尝试分析你的代码并减少内存占用。正如我在后端的大约50次运行中注意到的那样,不能保证关闭处理程序被调用。谷歌开发人员在后端谷歌IO视频中明确表达了这一点。
现在追逐此错误一段时间后,似乎AppEngine开发范例围绕着时间,内存等限制的url处理程序。这也适用于长时间运行的任务。我重新开始执行小任务的长期任务。在完成下一个任务的队列之前,任务队列触发了较小的任务。从来没有失败过一次!
优点是任务队列具有更好的故障保护/切换功能,而不仅仅是一项巨大的cron作业。一个任务失败并不意味着大型任务列表的其余部分失败。
当使用队列接近后端时,也可以完美地关闭挂钩工作。与有时在cron工作中相比,每次都被解雇。