我想采取的态度是,如果我的服务器端太慢,只需抛出异常并向客户端发回有意义的错误消息。我随意将此时间限制设置为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是否有这样的开箱即用的东西,如果我必须自己动手,我该怎么做呢?提前谢谢!
答案 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,的文章以获取更多信息。