Servlet 3.0异步超时

时间:2011-01-25 16:52:02

标签: java servlets comet

是否可以扩展servlet 3.0异步servlet的超时。 我尝试在超时方法中执行此操作但仍完成了异步请求。

延长超时的最佳方法是什么,以便异步servlet永远不会完成

的Tx

2 个答案:

答案 0 :(得分:2)

    Just change the asyncCtx.setTimeout(12000) in code.
Please find a simple implementation

它将进入无限循环,永不中断

    import java.io.IOException;
    import java.io.PrintWriter;

    import javax.servlet.AsyncContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    @WebServlet(urlPatterns = "/AsyncLongRunningServlet", asyncSupported = true)
    public class AsyncLongRunningServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;

        protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
            System.out.println("Request Processing Thread "+Thread.currentThread().getName());

            request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
            response.setContentType("text/html");
            PrintWriter printWriter=response.getWriter();
            printWriter.println("<html><head><title>Asynchronous servlet</title></head><body>");
            printWriter.println("Request Processing Thread "+Thread.currentThread().getName());
            printWriter.println("<br>");
            printWriter.println("<progress id='progress' max='100')></progress>");
            printWriter.println("<br>");

            AsyncContext asyncCtx = request.startAsync();
            asyncCtx.addListener(new AppAsyncListener());
            asyncCtx.setTimeout(12000);
            //release of request processing thread
            asyncCtx.start(() ->{
                printWriter.println("<br>");
                printWriter.println("Async thread Name "+Thread.currentThread().getName());
                printWriter.println("<br>");

                int i=0;
                while(i<100)
                {
                    printWriter.println("<script>document.getElementById('progress').value=\""+i+"\";</script>");
                    printWriter.flush();
                    try {
                        Thread.sleep(100);
                    } catch (Exception e) {
                    }
                }
                printWriter.println("</body></html>");
                asyncCtx.complete();
            }

        );
            printWriter.println("<br>");
            printWriter.println("End of response");
        }

    }


import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebListener;

@WebListener
public class AppAsyncListener implements AsyncListener {

    @Override
    public void onComplete(AsyncEvent asyncEvent) throws IOException {
        System.out.println("AppAsyncListener onComplete");
        // we can do resource cleanup activity here
    }

    @Override
    public void onError(AsyncEvent asyncEvent) throws IOException {
        System.out.println("AppAsyncListener onError");
        //we can return error response to client
    }

    @Override
    public void onStartAsync(AsyncEvent asyncEvent) throws IOException {
        System.out.println("AppAsyncListener onStartAsync");
        //we can log the event here
    }

    @Override
    public void onTimeout(AsyncEvent asyncEvent) throws IOException {
        System.out.println("AppAsyncListener onTimeout");
        //we can send appropriate response to client
        ServletResponse response = asyncEvent.getAsyncContext().getResponse();
        PrintWriter out = response.getWriter();
        out.write("TimeOut Error in Processing");
    }

}

答案 1 :(得分:1)

关于你没有得到任何答复的时间。所以我在这里打破沉默:P

AsyncContext cntx = request.startAsync(request, response);

long timeOut = DEFAULT_TIME_OUT;


if( req.getParameterMap().containsKey( TIME_OUT ) ){
    try {
        timeOut = Long.parseLong( req.getParameter( TIME_OUT ) );
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
}

cntx.setTimeout( timeOut );