Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用程序引擎>;60秒后端处理?_Java_Google App Engine - Fatal编程技术网

Java 应用程序引擎>;60秒后端处理?

Java 应用程序引擎>;60秒后端处理?,java,google-app-engine,Java,Google App Engine,我有一个appengine应用程序,可以接收pubsub消息 我正在处理可能需要60秒以上的数据 由于请求处理程序的运行时间为60秒,因此我立即确认pubsub,然后进行处理 虽然这没有帮助-我发送的消息会一次又一次地重试(我在日志中看到),即使处理已经完成 这是我的密码: public class Handler extends HttpServlet { @Override public void doPost(HttpServletRequest req, HttpServletRes

我有一个appengine应用程序,可以接收pubsub消息

我正在处理可能需要60秒以上的数据

由于请求处理程序的运行时间为60秒,因此我立即确认pubsub,然后进行处理

虽然这没有帮助-我发送的消息会一次又一次地重试(我在日志中看到),即使处理已经完成

这是我的密码:

public class Handler extends HttpServlet {


@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException  {


    // Acknowledge the message by returning a success code
    resp.setStatus(HttpServletResponse.SC_OK);
    resp.getWriter().close();

    JsonParser parser = JacksonFactory.getDefaultInstance().createJsonParser(req.getInputStream());
    parser.skipToKey("message");

    PubsubMessage message = parser.parseAndClose(PubsubMessage.class);
    log.info("request was received " +  message.getMessageId());
    String payload = new String(message.decodeData(), "UTF-8");

    doSomthingWithPayload(payload); // this takes more than 60 seconds
}

}
我尝试使用任务队列,但由于我的数据非常大,我得到的任务大小太大

问题:

  • 这是确认pubsub的正确方式吗
  • 确认后,该过程是否需要超过60秒?
    • 如果是-为什么我的pubsub消息一次又一次地被转发
    • 如果不是:当我不能使用任务队列时,作为一种变通方法,我可以做什么

  • 您需要尽快释放servlet线程。在代码中,您需要编写响应,而不是在servlet线程上执行有效负载处理。相反,在收到请求后,您应该立即解析负载并将其存储到数据存储,启动异步处理(通过任务队列),设置状态HttpServletResponse.SC_OK并从
    doPost
    返回。如果您将使用数据存储来存储负载,您将不会达到任务大小限制,因为您将能够输入仅任务的数据存储记录ID,而不是所有负载。

    我可以使用google存储而不是数据存储吗?存储过程是否需要不到60秒的时间?我从文档中了解到,请求处理程序生成和返回请求响应的时间有限,通常约为60秒。所以我不能回复,然后像上面代码中那样继续吗?这60秒的限制是什么?关于答复?或者也包括处理后记?1。如果愿意,您可以尝试使用云存储而不是云数据存储。2.在上面的代码中,您正在编写回复,然后继续使用servlet线程。因此,在您的方法中,60秒的时间限制适用于
    doSomethingWithPayload
    call。要摆脱此限制,您应该尽早从
    doPost
    返回控件。这就是为什么我建议在servlet线程上执行最小值:解析负载,将其写入某个持久存储,将任务发送到队列以进行异步处理,并从
    doPost
    返回。在我的方法中,lengthly
    doSomethingWithPayload
    调用不会在servlet线程上发生,而是在队列工作线程上发生,因此您可以绕过servlet请求处理时间限制(60秒)。请注意,如果使用App Engine标准运行时,任务最多可以运行10分钟,或者在灵活运行时上运行24小时:)。