Java HTTP Servlet请求处理超时

Java HTTP Servlet请求处理超时,java,servlets,Java,Servlets,如果无法以定时方式处理HTTPServlet请求,则需要实现超时。e、 g.如果请求处理时间超过30秒,则处理应超时 我已经阅读了Servlet3.1规范,但找不到任何可以设置为限制请求处理的配置 我已经使用Executor Service和固定线程池实现了该解决方案,该线程池是在servlet上下文侦听器中创建的,在servlet doGet方法中,我通过提交一个带有超时的新任务来创建一个新的未来。这很好用 所以我只是想知道在ApplicationServer或web.xml中是否还有其他确认

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

我已经阅读了Servlet3.1规范,但找不到任何可以设置为限制请求处理的配置

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

所以我只是想知道在ApplicationServer或web.xml中是否还有其他确认选项

我正在使用IBM WebSphere Liberty Profile Server,并尝试了以下超时,但它没有按我希望的方式工作:

1) tPoptions-inactivityTimeout
2) httpOptions-读取超时和写入超时

你认为这种方法有什么问题吗

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

}
protectedvoid doGet(HttpServletRequest请求,HttpServletResponse响应)
抛出ServletException、IOException{
长响应时间=System.currentTimeMillis();
PrintWriter pw=response.getWriter();
println(“服务请求线程:+Thread.currentThread().getName());
ExecutorService线程池=(ExecutorService)请求
.getServletContext().getAttribute(“线程池”);
Future=threadPool.submit(新任务(请求、响应));
试一试{
pw.println(“已启动”);
试一试{
println(future.get(3,TimeUnit.SECONDS));
}捕获(中断异常|执行异常e){
e、 printStackTrace();
}
println(“完成了!”);
}捕获(超时异常e){
future.cancel(true);
println(“终止!”);
println(“响应时间:+(System.currentTimeMillis()-responseTime));
}
}

HTTP请求超时是客户端的属性,而不是服务器的属性。在Liberty中,除非使用异步处理,否则无法在servlet级别设置超时。你想过使用异步处理吗?@Kayaman谢谢。客户端也有超时。但假设客户端超时时间为30秒。现在客户端发送一个请求,服务器需要60秒来完成响应。30秒后客户端超时,但正在执行该工作的服务器线程仍在继续,直到完成该工作。是这样吗?如果是,那么服务器端线程也需要超时。@mmulholl谢谢。我已经看过异步Servlet,并让原型在Tomcat上工作,但同样的代码在Liberty上不起作用。需要进一步研究。正如我所说,我使用Executor服务和固定线程池(在servlet上下文侦听器和servlet doGet方法中创建)获得了服务器端线程超时,我通过提交一个带有超时的新任务创建了一个新的未来。你认为这种方法有什么问题吗?@mmulholl我在消息中添加了代码。请看一看,让我知道这种方法是否好。HTTP请求超时是客户端的属性,而不是服务器的属性。除非使用异步处理,否则无法在servlet级别设置超时。你想过使用异步处理吗?@Kayaman谢谢。客户端也有超时。但假设客户端超时时间为30秒。现在客户端发送一个请求,服务器需要60秒来完成响应。30秒后客户端超时,但正在执行该工作的服务器线程仍在继续,直到完成该工作。是这样吗?如果是,那么服务器端线程也需要超时。@mmulholl谢谢。我已经看过异步Servlet,并让原型在Tomcat上工作,但同样的代码在Liberty上不起作用。需要进一步研究。正如我所说,我使用Executor服务和固定线程池(在servlet上下文侦听器和servlet doGet方法中创建)获得了服务器端线程超时,我通过提交一个带有超时的新任务创建了一个新的未来。你认为这种方法有什么问题吗?@mmulholl我在消息中添加了代码。请看一看,让我知道这个方法是好是坏。