Farouk Alhassan
Farouk Alhassan

Reputation: 3808

Servlet 3.0 async Timeouts

Is it possible to extend the timeout of a servlet 3.0 async servlet. I tried to do it in the timeout method but is still completed the async request.

What is the best way of extending the timeout such that the async servlet never completes

Tx

Upvotes: 1

Views: 2811

Answers (2)

abhijeet prakash
abhijeet prakash

Reputation: 77

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

It will go inside a infinite loop and never breaks out of it

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

}

Upvotes: 2

Talha Ahmed Khan
Talha Ahmed Khan

Reputation: 15433

Its about time that you haven't got any reply. So here I am breaking the silence :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 );

Upvotes: 1

Related Questions