Сервлет 3.0 асинхронный

В чем разница между асинхронной функцией сервлета 3.0:

Реализация старого сервлета:

doGet(request,response) {
Thread t = new Thread(new Runnable()
     void run(){
        // heavy processing
        response.write(result)
     }
}
t.start();

В сервлете 3.0, если я трачу нить на тяжелую обработку - я зарабатываю еще одну нить в контейнере, но трачу на тяжелую обработку... :(

Может ли кто-нибудь помочь?

Ответы

Ответ 1

Это не сработает. Как только ваш метод doGet завершится, ответ будет завершен и отправлен обратно клиенту. Ваш поток может или не может быть запущен, но он больше не может изменить ответ.

Что такое новая функция асинхронизации в Servlet 3.0, так это то, что она позволяет освободить поток запросов для обработки другого запроса. Случается следующее:

RequestThread:  |-- doGet() { startAsync() }  // Thread free to do something else
WorkerThread:                 |-- do heavy processing --|
OtherThread:                                            |-- send response --|

Важно то, что как только RequestThread запустил асинхронную обработку по вызову startAsync(...), он может свободно делать что-то еще. Например, он может принимать новые запросы. Это улучшает пропускную способность.

Ответ 2

Функция async для сервлета 3.0 обеспечивает сохранение http-соединения, но освобождение любых неиспользуемых потоков, когда запрос не может быть немедленно подан, но ожидает какого-либо события или, например, когда вы пишете какое-либо приложение кометы/обратного аякса., В приведенном выше случае вы создаете новый поток полностью, поэтому он не должен иметь никакого значения для вас, если вы не хотите, чтобы запрос ожидал какого-либо события.

С наилучшими пожеланиями, Кешав

Ответ 3

Существует несколько API-интерфейсов, поддерживающих COMET (длительные HTTP-запросы, где нет проблемы с потоком/запросом). Таким образом, нет никакой строгой необходимости использовать API сервлета 3 для предотвращения потока/запроса. Одним из них является Grizzly движок, который работает в Glassfish 2.11 (example). Второе решение Jetty Continuation. Третий API сервлета 3..

Основная идея заключается в том, что запрос создает некоторый асинхронный обработчик, управляемый контейнером, в котором запрос может подписаться на событие, идентифицированное объектом (например, строка clientid). Затем один асинхронный поток обработки может сказать обработчику, что событие occours, и запрос получает поток для продолжения. Это полностью зависит от выбранного сервера приложений, с помощью которого вы можете использовать API. Каков ваш выбор?

Ответ 4

Создание собственных потоков в контейнере сервлетов требует проблем. (Там могут быть случаи, когда вам нужно это делать, но если у вас есть фреймворк, который управляет потоками для вас, вы должны его использовать.)