Java 应用程序引擎>;60秒后端处理?
我有一个appengine应用程序,可以接收pubsub消息 我正在处理可能需要60秒以上的数据 由于请求处理程序的运行时间为60秒,因此我立即确认pubsub,然后进行处理 虽然这没有帮助-我发送的消息会一次又一次地重试(我在日志中看到),即使处理已经完成 这是我的密码: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
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消息一次又一次地被转发
- 如果不是:当我不能使用任务队列时,作为一种变通方法,我可以做什么李>
您需要尽快释放servlet线程。在代码中,您需要编写响应,而不是在servlet线程上执行有效负载处理。相反,在收到请求后,您应该立即解析负载并将其存储到数据存储,启动异步处理(通过任务队列),设置状态HttpServletResponse.SC_OK并从
doPost
返回。如果您将使用数据存储来存储负载,您将不会达到任务大小限制,因为您将能够输入仅任务的数据存储记录ID,而不是所有负载。我可以使用google存储而不是数据存储吗?存储过程是否需要不到60秒的时间?我从文档中了解到,请求处理程序生成和返回请求响应的时间有限,通常约为60秒。所以我不能回复,然后像上面代码中那样继续吗?这60秒的限制是什么?关于答复?或者也包括处理后记?1。如果愿意,您可以尝试使用云存储而不是云数据存储。2.在上面的代码中,您正在编写回复,然后继续使用servlet线程。因此,在您的方法中,60秒的时间限制适用于doSomethingWithPayload
call。要摆脱此限制,您应该尽早从doPost
返回控件。这就是为什么我建议在servlet线程上执行最小值:解析负载,将其写入某个持久存储,将任务发送到队列以进行异步处理,并从doPost
返回。在我的方法中,lengthlydoSomethingWithPayload
调用不会在servlet线程上发生,而是在队列工作线程上发生,因此您可以绕过servlet请求处理时间限制(60秒)。请注意,如果使用App Engine标准运行时,任务最多可以运行10分钟,或者在灵活运行时上运行24小时:)。