App Engine> 60秒后端处理?

时间:2016-12-21 21:58:04

标签: java google-app-engine

我有一个接收pubsub消息的appengine应用程序。

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

由于请求处理程序为limited 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
}

}

我尝试使用任务队列,但由于我的数据非常大,我得到Task size too large

的问题:

  1. 这是承认pubsub的正确方法吗?
  2. 确认后过程需要超过60秒吗?
    • 如果是 - 为什么我的pubsub消息一次又一次地重新发送?
    • 如果没有:我可以做什么作为解决方法 - 虽然我不能使用任务队列?

1 个答案:

答案 0 :(得分:3)

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