2

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

我看到 App EngineApiProxy.getCurrentEnvironment().getRemainingMillis()提供了我们在抛出 aDeadlineExceedException和超时之前剩下的毫秒数。

我想做类似的事情,但是对 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 个!)线程来创建背景“定时器线程”,除非我绝对必须这样做。

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

4

1 回答 1

1

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

但是,您可以使用App-Engine JRE 白名单中包含的类Timer和两者。TimerTask

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

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

阅读这篇关于Java 中的作业调度的文章,了解更多信息。

于 2012-11-12T23:35:38.167 回答