Как DeadlineExceededException реализован в Google App Engine для Java? - PullRequest
8 голосов
/ 18 июня 2009

Приложения в Google App Engine должны иметь веб-запросы, которые возвращают данные ответов в течение 30 секунд. Когда это время превышено, выдается исключение DeadlineExceededException:

/time.jsp
java.lang.ClassCastException: com.google.apphosting.api.DeadlineExceededException cannot be cast to javax.servlet.ServletException
    at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:754)
    at org.apache.jsp.time_jsp._jspService(time_jsp.java:66)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:237)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
    at org.mortbay.jetty.Server.handle(Server.java:313)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:125)
    at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4755)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4753)
    at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24)
    at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:359)
    at com.google.net.rpc.impl.Server$2.run(Server.java:800)
    at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56)
    at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:510)
    at com.google.net.rpc.impl.Server.startRpc(Server.java:756)
    at com.google.net.rpc.impl.Server.processRequest(Server.java:348)
    at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:459)
    at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319)
    at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290)
    at com.google.net.async.Connection.handleReadEvent(Connection.java:419)
    at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:762)
    at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:207)
    at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101)
    at com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251)
    at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:373)
    at java.lang.Thread.run(Unknown Source)

Как это сделать? Есть ли у вас открытый исходный код?

Ответы [ 4 ]

3 голосов
/ 06 октября 2009

Таймер запроса

Обработчик запросов имеет ограниченное количество времени для генерации и возврата ответ на запрос, обычно около 30 секунд. После крайнего срока был достигнут обработчик запроса прерывается.

среда выполнения Java прерывает сервлет, бросая com.google.apphosting.api.DeadlineExceededException. Если обработчик запроса не ловит это исключение, как и со всеми необученными исключения, среда выполнения вернет ошибку сервера HTTP 500 клиенту.

Обработчик запросов может поймать это ошибка, чтобы настроить ответ. среда выполнения дает запрос обработчик немного больше времени (меньше чем через секунду) после поднятия исключение для подготовки обычая ответ.

В то время как запрос может занять до 30 секунд, чтобы ответить, App Engine оптимизирован для приложений с краткосрочные запросы, как правило, те, это займет несколько сотен миллисекунд. Эффективное приложение быстро реагирует на большинство запросов. Приложение, которое не будет хорошо масштабироваться с приложением Инфраструктура двигателя.

Часть времени выполнения == Не использует потоки. Эта функция, безусловно, является модификацией виртуальной машины, и я не буду задерживать дыхание в ожидании исходного кода.

1 голос
/ 02 августа 2015

Может быть очень поздно, но полезно для новых учеников.

@Override
protected final void doGet(final HttpServletRequest req, final HttpServletResponse res) throws IOException {

    res.setContentType("text/html");
    final PrintWriter out = res.getWriter();
    final String a = req.getParameter("a");
    try {

        for (int i = 0; 1 < 5; i++) {
            out.print("Mode " + a + " Running " + i + " " + MainServlon.doubleIt(i));
            Thread.sleep(90000);
        }

    } catch (final InterruptedException e) {
        e.printStackTrace();
    } catch (final DeadlineExceededException e) {
        out.print("Train is going to stop. Let me close this story for now!");
    }

}
1 голос
/ 16 октября 2009

Это можно сделать следующим образом, использовать неблокирующий ввод-вывод и создать сторожевой поток, который записывает время запуска и выдает исключение по истечении истекшего времени. В руководстве по неблокирующему вводу-выводу показано, как это можно сделать на примере Ping.java .

1 голос
/ 18 июня 2009

Я полагаю, что механизм этого исключения реализован в инфраструктуре ядра приложения, то есть не с открытым исходным кодом.

Однако вы можете использовать эту функцию для работы в сети или, в более общем случае, для любого кода, ограниченного вводом-выводом, используя java.nio (например, Selector ). Вместо этого для ограниченного кода ЦП вы можете использовать java.util.concurrent (например, Future ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...