Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 425
Ильдар Шаукатович Хабибуллин
"Asynchronous processing is not supported"); return;
}
AsyncContext asyncCtx = request.startAsync(); asyncCtx.addListener(new MyAsyncListener());
asyncCtx.setTimeout(20000);
Executor executor = new ThreadPoolExecutor(10, 10, 50000L,
TimeUnit. MI LLI SECONDS,
new LinkedBlockingQueue<Runnable>(100)); executor.execute(new AsyncProcessor(asyncCtx));
}
}
class AsyncProcessor implements Runnable { private AsyncContext asyncContext;
public AsyncProcessor(AsyncContext asyncContext) { this.asyncContext = asyncContext;
@Override
public void run() {
String reqId = asyncContext.getRequest().getParameter("id"); if (null == reqId || reqId.length() == 0) reqId = "unknown"; Date before = new Date();
String result = longStandingProcess(reqId);
String resp = "Request id: " + reqId +
"<br/> Started at: " + before.toString() +
".<br/> Completed at: " + result + ".<br/>"; asyncContext.getResponse().setContentType("text/html");
try {
PrintWriter out = asyncContext.getResponse().getWriter(); out.println(resp);
} catch(Exception e) {
System.out.println(e.getMessage() + ": " + e);
}
asyncContext.complete();
}
public String longStandingProcess(String reqId) { try {
Thread.sleep(10000);
} catch (InterruptedException ie) {
System.out.println("Request: " + reqId +
", " + ie.getMessage() + ": " + ie);
}
return new Date().toString();
}
}
@WebListener
public class MyAsyncListener implements AsyncListener { public MyAsyncListener() { }
public void onComplete(AsyncEvent ae) {
System.out.println("AsyncListener: onComplete for request: " + ae . getAsyncContext () . getRequest () . getParameter ( "id" ) ) ;
}
public void onTimeout(AsyncEvent ae) {
System.out.println("AsyncListener: onTimeout for request: " + ae.getAsyncContext() .getRequest() .getParameter("id") ) ;
}
public void onError(AsyncEvent ae) {
System.out.println("AsyncListener: onError for request: " + ae.getAsyncContext().getRequest().getParameter("id"));
public void onStartAsync(AsyncEvent ae) {
System.out.println("AsyncListener: onStartAsync");
}
}
В этом простейшем примере длительный процесс — это просто задержка на 10 секунд в методе longStandingProcess (). Метод longStandingProcess () вызывается в рамках подпроцесса, выполняющего метод run() класса AsyncProcessor. После выполнения метода longStandingProcess () формируется ответ клиенту — строка resp — и отправляется в выходной поток, после чего асинхронное выполнение завершается методом complete (). Роль метода doGet () заключается только в запуске нового подпроцесса методом execute (), после чего метод doGet () завершается, не формируя никакого ответа.
В более сложной ситуации, когда запросы идут один за другим, создается очередь запросов, выполняемых асинхронно. Очередь освобождается по мере выполнения запросов. Такой пример, названный AsyncRequest, приведен в стандартной поставке Java EE 6 SDK.
Вопросы для самопроверки
1. Какая разница между HTTP-сервером и Web-сервером?
2. Что такое сервер приложений?
3. Что такое сервлет?
4. Что такое контейнер сервлетов?