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