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

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

16 голосов
/ 28 сентября 2010

Чем отличается асинхронная функция сервлета 3.0 от:

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

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

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

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

Ответы [ 4 ]

25 голосов
/ 28 сентября 2010

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

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

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

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

2 голосов
/ 02 октября 2010

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

2 голосов
/ 28 сентября 2010

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

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

2 голосов
/ 28 сентября 2010

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

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

...