2010-09-28 5 views
14

Что diffrent между сервлетов 3.0 асинхронной функции против:Servlet 3.0 асинхронный

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

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

Кто-нибудь может помочь?

+7

Если какой-либо из приведенных ниже ответов является тем, что вы искали, не могли бы вы отметить это как таковое? –

ответ

2

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

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

23

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

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

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

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

+0

Насколько я понимаю, 'RequestThread' не будет« бесплатным », чтобы сделать что-то еще сразу после вызова' startAsync (...) ', он будет свободен только тогда, когда' RequestThread' выполнит свое задание, например, если 'startAsync (...)' вызывается внутри 'doGet()' 'RequestThread' будет бесплатным после выполнения' doGet() '. – user454322

+0

Чтобы быть точным, поток, который обрабатывает 'doGet()', будет доступен после завершения всего стека методов (метод, который вызывает метод ......, который вызывает метод, который вызывает 'doGet() '). –

+0

Да, это то, что я имел в виду. – user454322

2

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

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

+0

Следует отметить, что Grizzly и Jetty выполняют все это самостоятельно, тогда как стандарт Servlet 3.0 означает, что такие непереносимые (на разных серверах приложений) больше не понадобятся.Естественно, что Grizzly и Jetty оба (или собираются) внедряют Servlet 3.0, можно себе представить. Таким образом, это не вопрос выбора между тремя, а выбор того, какой из двух, которые реализуют третий, вам нравится. – user359996

2

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

Смежные вопросы