在Google App Engine Java中,我正在尝试运行后端,但我总是在后端日志中收到错误消息。
进程因无法响应启动请求而终止 HTTP 状态代码为 200-299 或 404。
应用引擎日志
2014-12-07 11:06:31.944 /_ah/start 302 4842ms 0kb instance=0 module=default version=testservice
0.1.0.3 - - [06/Dec/2014:21:36:31 -0800] "GET /_ah/start HTTP/1.1" 302 231 - - "0.testservice.testapp.appspot.com" ms=4842 cpu_ms=7626 cpm_usd=0.000026 loading_request=1 exit_code=107 instance=0 app_engine_release=1.9.16
com.test.AppFilter doGet: Filter Initiated..!
此请求导致为您的应用程序启动一个新进程, 从而导致首次加载应用程序代码。 因此,此请求可能需要更长的时间,并且使用比典型请求更多的 CPU 请求您的申请。E 2014-12-05 11:02:16.916
进程因无法响应启动请求而终止 HTTP 状态代码为 200-299 或 404。
请帮忙。
当模块(或以前的版本:后端(启动时,Google App Engine 编排器会向 /_ah/start
发送 HTTP 请求。您可以使用此 HTTP 请求执行所需的任何初始化操作。
如日志消息中所述,此 HTTP 请求必须返回介于 200
和 299
(告知请求已正确处理(或 404 Not Found
(告知您未将任何 servlet 或过滤器附加到此请求(之间的 HTTP 状态代码。
所有这些都在此页面的Google文档中进行了解释。
这里的答案是302 Redirect
.这通常由重定向到身份验证屏幕的安全过滤器进行尝试。
如果定义了处理/_ah/start
URL 的自定义安全过滤器或 servlet,请确保它返回200
HTTP 代码。
如果在此 URL 上设置了<security-constraint>
(除了强制 SSL 之外(,请将其删除。
Process terminated because it failed to respond to the start request with an HTTP status code of 200-299 or 404.
上面的错误消息是导致预热或启动失败的任何内容的全部内容。基本上,如果/_ah/start 的 doGet 没有以这些 HTTP 状态代码之一完成,则会生成此错误。
在寻找根本原因时我不明白的是/_ah/start Servlet 在预热或上下文初始化 (CI( 过程完成之前没有首先(串行(完成。也就是说,上下文初始化作为启动 Servlet 的依赖项运行,这意味着如果它 (CI( 失败,整个启动将失败,从而生成上述消息。
不幸的是,该消息没有提供太多关于根本原因所在的说明。例如,如果您有上下文侦听器(例如注释为@WebListener(,并且 contextInitialized(ServletContextEvent sce( 方法未成功完成(崩溃,生成堆栈跟踪(,则该问题可能是此错误的根本原因。
查找问题的最简单方法是检查日志中是否有任何堆栈跟踪,从日志中的警告消息开始。也就是说,查看是否有任何启动、预热或上下文初始化代码崩溃。如果您发现问题,请修复它。
下面是在 Java-Gen2 旧版捆绑服务配置中工作的示例定义(修复上下文初始化问题后(。
@WebServlet(name = "StartUpHttpHandlerServlet", description = "Startup Http Handler Servlet", urlPatterns = {"/_ah/start"})
public class StartUpHttpHandlerServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setStatus(200);
}
}
}
本文档很好地描述了启动过程,但没有具体介绍可能导致上述错误消息的原因。