java - Servlet 3.0 异步超时

标签 java servlets comet

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

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

发送

最佳答案

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

}

关于java - Servlet 3.0 异步超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4796410/

相关文章:

JAVA:使用 XmlStreamReader 收集 xml 标记的字节偏移量

java - 模拟器在输入经纬度时重新启动

用于检查数据库中是否存在用户名和密码的java Web应用程序

javascript - 如何处理退出后点击 "Back"按钮的用户

apache - cometd 如何与客户端一起工作

javascript - Lightstreamer 背后的魔力是什么?

java - 如何使用 ModuleConfiguration.java 配置 Spring XD 模块?

java - 使用 LuaJava 从 Luafile 调用带有可变数字参数的 Java 方法

shell - ProcessBuilder.start() 返回 0 但不执行 shell 脚本

c - 如何使用 C 建立 HTTP 连接?