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

Java GAE:进程终止,因为后端关闭时间太长,java,google-app-engine,Java,Google App Engine,我正在Google Appengine应用程序的后端实例中运行一个长任务(大约6小时) 以下是后端配置: <backend name="backend_1"> <class>B4_1G</class> <options> <public>true</public> <dynamic>false</dynamic> </options>

我正在Google Appengine应用程序的后端实例中运行一个长任务(大约6小时)

以下是后端配置:

<backend name="backend_1">
    <class>B4_1G</class>
    <options>
        <public>true</public>
        <dynamic>false</dynamic>
    </options>
</backend>
我环顾四周寻找解决方案,我读到关于的,我实现了,但它似乎不起作用

LifecycleManager.getInstance().setShutdownHook(new ShutdownHook()
{
    public void shutdown()
    {
        log().info("Shutting down...");
        LifecycleManager.getInstance().interruptAllRequests();
    }
});
日志消息从未显示,只有
进程因为…
消息而终止

我还实现了isShuttingDown检查

LifecycleManager.getInstance().isShuttingDown();
在我的流程的每个周期中,我检查的第一件事是后端是否正在关闭,但是这个标志从来都不是真的

进程总是被“残酷”中断,没有任何钩子来控制关闭(也许我可以停止操作,保存一些数据以备将来恢复)

我考虑了一个“内存不足”错误,但我没有在内存中存储任何“大”对象。此外,在每个循环中,实例变量都设置为NULL,从而强制释放内存

还有,我期待着这样的错误

Uncaught exception from servlet java.lang.OutOfMemoryError: Java heap space
如果这是问题所在

我是唯一遇到这种问题的人吗


已经阅读了,但是没有解决方案

我对python也有同样的问题。在我的例子中,我只看到终止的消息。检查时,cpu、内存使用n均正常。永远不会减少配置文件并降低内存消耗。仍然看到同样的事情。在您的例子中,它表示内存问题,您可以尝试分析代码并降低内存占用。正如我在大约50次后端运行中所注意到的,关闭处理程序不能保证被调用。谷歌开发者在后端的谷歌IO视频中明确了这一点

在跟踪这个错误一段时间之后,AppEngine开发范式似乎围绕url处理程序展开,但在时间、内存等方面存在限制。这也适用于长时间运行的任务。我将我的长期任务重新定义为执行小任务。任务队列触发了较小的任务,这些任务在完成下一个任务队列之前运行。从未失败过一次

其优点是,TaskQueue具有比大型cron作业更好的故障保护/切换功能。一项任务失败并不意味着庞大任务列表中的其他任务失败

当接近带有队列的后端时,关闭钩子也能完美地工作。每次都被炒鱿鱼,而不是在cron上

Uncaught exception from servlet java.lang.OutOfMemoryError: Java heap space