1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Asynchronous Request (iniciante)

Aê galera. Tenho uma dúvida em relação a tornar uma request assíncrona.

Estou lendo o livro Caelum fj21, ele diz o seguinte:

"Muitas vezes em nossas aplicações temos alguns servlets que, para analizarem a escrita da resposta ao cliente, dependem de recursos externos como, por exemplo, uma conexão JDBC, um Web Service ou uma mensagem JMS."

Segue a implementação do Servlet que realiza requests assíncronas:

@WebServlet(name="addContato",value="/adiciona/contato", asyncSupported=true)
public class AdicionaContatoServlet extends HttpServlet{

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    final PrintWriter out = response.getWriter();
    final AsyncContext context = request.startAsync(request,response);

    context.addListener(new AsyncListener(){
      @Override
      public void onComplete(AsyncEvent event) throws IOException{
        out.println("<html>");
        out.println("<body>");
        out.println("Olá mundo!");
        out.println("</body>");
        out.println("</html>");
      }
    });

    //Aguardando conexão JDBC
    ContatoDAO dao = new ContatoDAO();
    //A logica

    //Lógica completa, chama listener onComplete
    context.complete();
  }
}

O livro também diz o seguinte:

"Note que, ao fazer uma chamada ao método startAsync, é retornado um objeto do tipo AsyncContext. Esse objeto guarda os objetos request e response passados ao método startAsync.

A partir dessa chamada de método, a thread que tratava nossa requisição foi liberada para executar outras tarefas. Na classe AsyncContext, temos o método complete para confirmar o envio da resposta ao cliente."

Abaixo da chamada context.addListener(), ocorre a operação de busca ao recurso externo (Conexão JDBC) em que após finalizado a operação, são chamados os métodos context.complete() e onComplete(), respectivamente.

O que eu não entendi foi: a thread fica liberada para fazer outras tarefas, mas quais tarefas? No código dado como exemplo eu não consegui identificar o local em que poderiam ser implementado as "outras" tarefas que a thread poderia realizar após ser liberada da busca ao recurso externo.

Uma outra dúvida seria o seguinte: este tipo de processamento assíncrono pode fazer com que o servlet mande uma resposta ao cliente sem a utilização do recurso externo, e posteriormente mandar um outra resposta com o recurso externo, complementando a anterior já renderizada, em uma metodologia semelhante à utilizada pelo AJAX? Ou este processo assíncrono é válido somente para agilizar o andamento de uma única request?

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags servlets java-ee threads assíncrono ou faça a sua própria pergunta.