Qual é o objetivo do AsyncContext.start (…) no Servlet 3.0?

API do Servlet diz sobre "AsyncContext.start":

void start (java.lang.Runnable run)

Faz com que o contêiner despache um encadeamento, possivelmente de um conjunto de encadeamentos gerenciados, para executar o Runnable especificado. O contêiner pode propagar informações contextuais apropriadas para o Runnable.

A partir dessa descrição, não está claro como isso se relaciona com a tarefa de otimizar o uso do encadeamento quando o trabalho exige espera.

Em "Servlet & JSP", Budi Kurniawan dá exemplo dos recursos assíncronos do Servlet 3.0, onde ele usaAsyncContext.start, Mostrarei a versão simplificada do exemplo:

<code>public void doGet(...) {
    final AsyncContext asyncContext = request.startAsync();

    asyncContext.start(new Runnable() {                        
        @ Override
        public void run() {
            // do some work here which involves waiting
            ...
            asyncContext.complete();
        }
    });
}
</code>

Na maioria dos outros exemplos que eu conheci, o método de serviço apenas armazena o AsyncContext em algum lugar e é processado em outro lugar (por exemplo, por um thread de segundo plano). Neste exemplo, parece que o trabalho acabou de ser passado para outro thread, que conclui o pedido. Pelo que entendi, agora é simplesmente o segmento de trabalho, que perde tempo em espera.

Você realmente ganha algo passando o trabalho (que envolve espera) de um segmento para outro? Se não, então qual é o propósito deAsyncContext.start(...)?

questionAnswers(4)

yourAnswerToTheQuestion