Читать «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. Что такое контейнер сервлетов?