Java GAE:进程终止,因为后端花了太长时间才能关闭

时间:2013-09-16 15:18:27

标签: java google-app-engine

我在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,但没有解决方案

1 个答案:

答案 0 :(得分:0)

我遇到了与python相同的问题。就我而言,我看到的只是终止的消息。检查时cpu,内存使用情况都没问题。从来没有那么简介并且降低了内存消耗。仍然看到同样的事情。在你的情况下它说内存问题,你可以尝试分析你的代码并减少内存占用。正如我在后端的大约50次运行中注意到的那样,不能保证关闭处理程序被调用。谷歌开发人员在后端谷歌IO视频中明确表达了这一点。

现在追逐此错误一段时间后,似乎AppEngine开发范例围绕着时间,内存等限制的url处理程序。这也适用于长时间运行的任务。我重新开始执行小任务的长期任务。在完成下一个任务的队列之前,任务队列触发了较小的任务。从来没有失败过一次!

优点是任务队列具有更好的故障保护/切换功能,而不仅仅是一项巨大的cron作业。一个任务失败并不意味着大型任务列表的其余部分失败。

当使用队列接近后端时,也可以完美地关闭挂钩工作。与有时在cron工作中相比,每次都被解雇。