@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write(super.getServletName()); AsyncContext asyncContext = req.startAsync(); asyncContext.setTimeout(0); /* * O metodo createListener() cria um listener da classe informada que * deve extender AsyncListener. Este metodo adiciona suporte para a * notacoes e injecao de dependencias dentro do listener criado, deste * modo, objetos sao injetados dentro desse listener depois que ele é * criado. */ MyAsyncListener myAsyncListener = asyncContext.createListener(MyAsyncListener.class); /* * O metodo addListener(AsyncListener) registra o listener informado ao * AsyncContext em questao. */ asyncContext.addListener(myAsyncListener); /* * O metodo addListener() é sobrecarregado para receber um * ServletRequest e um ServletResponse, que podem ser recuperados mais * tarde dentro do listener atraves dos metodos getSuppliedRequest() e * getSuppliedResponse() de AsyncEvent. */ // asyncContext.addListener(myAsyncListener, null, null); AsyncTask task = new AsyncTask(asyncContext); asyncContext.start(task); }
/** * Caso o response ja esteja fechado ou o metodo startAsync() ja tenha sido chamado, uma nova * invocacao resultara em uma IllegalStateException. */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); writer.println("Antes de iniciar a tarefa assincrona"); /* * Para iniciar uma requisicao assincrona, basta chamar o metodo * startAsync de ServletRequest. O metodo startAsync é sobrecarregado * para receber um ServletRequest e um ServletResponse, desta forma é * possivel passar wrappers para ele. Caso o metodo startAsync seja * chamado, os objetos ServletRequest e Response originais serao * utilizados. */ AsyncContext asyncContext = req.startAsync(); MyAsyncTask asyncTask = new MyAsyncTask(asyncContext, writer); /* * O tempo padrao de time out depende do container, geralmente está * entre 5 e 10 segundos. Para desabilitar o time out basta informar um * valor negativo ou 0. Esse metodo pode ser chamado antes ou depois do * metodo start(). */ asyncContext.setTimeout(-1); /* * A Interface AsyncContext possui metodos para configurar a tarefa * assincrona e inicializar a mesma. O metodo estart recebe um runnable * que sera responsavel por realizar o processamento da tarefa * assincrona. Quando esse metodo é chamado, o processamento é realizado * por outra Thread do pool de Threads do servidor. */ asyncContext.start(asyncTask); /* * Depois do start() da tarefa assincrona, o fluxo continua normalmente, * e quando o metodo service() é encerrado, a resposta nao é commitada * enquanto o metodo complete() de AsyncContext não for chamado. Desta * forma, o container processa a tarefa assincrona um background em * outra Thread. */ writer.println("Depois de iniciar a tarefa assincrona"); /* * Retorna o AsyncContext inicializado para esse request. Caso o metodo * startAsync() ainda nao tenha sido chamado, uma IllegalStateException * ocorrera. */ req.getAsyncContext(); }
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); logger.info(req.getDispatcherType()); out.println("success async2"); // 非法调用,此时Async的状态是DISPATCHED,complete在startAsync调用之后,dispatch之前进行调用是合法的;否则抛出IllegalState // 此时分派尚未返回到容器,在service返回后,容器将执行complete // asyncContext.complete(); AsyncContext asyncContext = req.startAsync(); asyncContext.start( () -> { System.out.println("Start!"); asyncContext.complete(); // 完成,进行响应 }); }
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final AsyncContext asyncContext = request.startAsync(request, response); asyncContext.addListener(new TrackingListener(false, false, null)); asyncContext.start( new Runnable() { @Override public void run() { try { Thread.sleep(3 * 1000); asyncContext.getResponse().getWriter().write("Runnable-"); asyncContext.complete(); } catch (Exception e) { e.printStackTrace(); } } }); }
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { final AsyncContext asyncCtx = req.startAsync(req, res); AsyncAction asyncAction = new AsyncAction(); asyncCtx.addListener(new MyAsyncListener()); asyncCtx.start(asyncAction.f.service(asyncCtx)); }