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(...)
?