Вопрос по java, http – Как DeadlineExceededException реализован в Google App Engine для Java?

8

Заявки на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)

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

@Nick Johnson: Потому что это может быть полезно для реализации в других (самостоятельно размещенных) приложениях, где приложение может многое делать с другими подсистемами (выборка URL-адресов с других сайтов, поиск по огромному индексу lucene, взаимоблокировки в базе данных), и вам может понадобиться чтобы избежать истощения нитей, используя этот метод (грубой силы). cherouvim
Хм ... Потому что люди любопытны? wds
Говоря прямо, почему тебя это волнует? Nick Johnson

Ваш Ответ

4   ответа
1

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

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

1

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

@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!");
    }

}
Привет тихо согласился!
Вопрос был о том, как генерируется исключение для каждого запроса / сервлета & gt; 30-е годы, а не как его поймать. Franck
1

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

Вопрос в том, как это делает GAE. Google говорит, что это реализовано во время выполнения.code.google.com/appengine/docs/java/…
3

The Request Timer

A request handler has a limited amount of time to generate and return a response to a request, typically around 30 seconds. Once the deadline has been reached, the request handler is interrupted.

The Java runtime environment interrupts the servlet by throwing a com.google.apphosting.api.DeadlineExceededException. If the request handler does not catch this exception, as with all uncaught exceptions, the runtime environment will return an HTTP 500 server error to the client.

The request handler can catch this error to customize the response. The runtime environment gives the request handler a little bit more time (less than a second) after raising the exception to prepare a custom response.

While a request can take as long as 30 seconds to respond, App Engine is optimized for applications with short-lived requests, typically those that take a few hundred milliseconds. An efficient app responds quickly for the majority of requests. An app that doesn't will not scale well with App Engine's infrastructure.

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

Похожие вопросы