如何强加Google App Engine的DeadlineExceededException?

时间:2012-11-12 21:06:35

标签: java multithreading google-app-engine

我想采取的态度是,如果我的服务器端太慢,只需抛出异常并向客户端发回有意义的错误消息。我随意将此时间限制设置为5秒,并根据需要进行调整。

我看到App Engine有ApiProxy.getCurrentEnvironment().getRemainingMillis(),它给出了我们在抛出DeadlineExceedException之前剩下的毫秒数,并将我们排除在外。

我想做类似的事情,但是对GAE的60秒限制施加我自己的5秒限制(再次,现在,如果我选择5秒或40秒,无论如何,只要它们比GAE强加的更严格。我想编写一个启动5秒计时器的服务器端处理程序/ servlet。如果请求在该时间内没有返回,则会抛出异常并返回客户端:

public class MyTimedServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException {
        // Start 5-second timer
        Timer timer = new Timer(5000);

        try {
            timer.start();
            response = handleRequest(request);
        }
        catch(TimeException timerException) {
            response = ResponseFactory.newTimeExceededResponse();
        }
    }
}

不幸的是,我在GAE API中看不到任何与我正在寻找的Timer对象相似的内容。

我已经计划通过ThreadManager.currentRequestThreadFactory().newRequestThread(...)使用多线程的每个请求,所以我不想浪费其中一个(我一次只得到10个!)线程来创建一个背景“< em>计时器线程“除非我绝对必须。

所以我问:GAE是否有这样的开箱即用的东西,如果我必须自己动手,我该怎么做呢?提前谢谢!

1 个答案:

答案 0 :(得分:1)

代码中的任何异步任务(不遵循正常流程)都涉及新的线程执行,在这种情况下,此任务是计算时间。

但是,您可以使用课程Timer&amp; TimerTask这两个都包含在App-Engine JRE白名单中。

示例代码:未经过测试只是一个指南。

public class YourServlet extends HttpServlet {

    Timer timer;
    HttpServletResponse response;   

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)...{
        int seconds = 5;
        timer = new Timer();
        timer.schedule(new DeadLine(), seconds * 1000);     

        /* the rest of your code here */
    }

    class DeadLine extends TimerTask {
        public void run() {      
            response.getWriter().print("Error: deadline reached.");     
        }
      }
}

阅读有关job scheduling in Java,的文章以获取更多信息。