HTTP Servlet请求处理超时

时间:2015-12-11 18:05:26

标签: java servlets

如果无法以定时方式处理HTTPServlet请求,则需要实现超时。例如如果请求处理时间超过30秒,则处理应该超时。

我已经完成了servlet 3.1规范,但找不到任何我可以设置的配置来限制请求处理。

我使用具有固定线程池的Executor Service实现了解决方案,该线程池是在servlet上下文侦听器和servlet doGet方法中创建的,我通过提交带有超时的新任务创建了一个新的Future。这非常有效。

所以,只是想知道应用程序服务器或web.xml中是否有其他可用的配置选项?

我正在使用IBM WebSphere Liberty Profile Server并尝试执行以下超时但它无法正常工作:

1)tcpOptions - inactivityTimeout
2)httpOptions - readTimeout和writeTimeout

您认为此方法存在任何问题吗?

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    long responseTime = System.currentTimeMillis();     
    PrintWriter pw = response.getWriter();
    pw.println("Service Request Thread: " + Thread.currentThread().getName());

    ExecutorService threadPool = (ExecutorService) request
           .getServletContext().getAttribute("threadPool");     

    Future<String> future = threadPool.submit(new Task(request, response));

    try {

        pw.println("Started..");

        try {
            pw.println(future.get(3, TimeUnit.SECONDS));
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        pw.println("Finished!");

    } catch (TimeoutException e) {
        future.cancel(true);
        pw.println("Terminated!");
        pw.println("Response time: " + (System.currentTimeMillis() - responseTime));
    }

}

0 个答案:

没有答案