【问题标题】:Java GAE: Process terminated because the backend took too long to shutdownJava GAE:进程终止,因为后端关闭时间过长
【发布时间】:2013-09-20 19:30:20
【问题描述】:

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

【问题讨论】:

    标签: java google-app-engine


    【解决方案1】:

    我在使用 python 时遇到了同样的问题。就我而言,我看到的只是终止的消息。检查时,CPU,内存使用情况都很好。永远不会减少配置并降低内存消耗。看到的还是一样的。在您的情况下,它说内存问题,您可以尝试分析您的代码并降低内存占用。同样,正如我在大约 50 次后端运行中注意到的那样,不能保证调用关闭处理程序。 Google 开发人员在后端的 Google IO 视频中明确说明了这一点。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 2015-04-29
      • 2020-12-21
      • 2012-09-16
      • 2020-08-16
      • 2020-09-19
      • 2013-08-13
      • 2019-04-23
      • 1970-01-01
      相关资源
      最近更新 更多