Вопрос по web, multithreading, servlets, java – запуск новой темы в сервлете

5

Когда запрос достигает сервлета, который обрабатывает загрузку файлов, рекомендуется начать новый поток в этом сервлете, используяnew Thread(r).start() это будет обрабатывать другую часть данных, которые пришли с файлом, который был загружен. Я хотел, чтобы это обрабатывало обе работы параллельно.

@BigMike Glassfish 3.1.1 saplingPro
какой сервер приложений вы используете? это обеспечивает некоторую поддержку для долгосрочных задач? BigMike
Я бы против этого, если вы не используете пул потоков. В качестве альтернативы, сервлет 3 теперь имеет асинхронный сервисный вызов, почему бы не изучить это? Buhake Sindi

Ваш Ответ

3   ответа
-5

B), так что да, все в порядке.

РЕДАКТИРОВАТЬ: вторая мысль @ Томаш Нуркевич прав. Загрузка файла будет остановлена.

Пока поток не использует нелокальные переменные (поля в сервлете), проблем не возникает. Я предполагаю, что все происходит внутри метода doGet / doPost
Не правда, запись потока в параллельной среде должна быть управляемой.
18

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

Поверьте, некоторые пользователи уже испытали это:HttpServletResponse, кажется, периодически отправлять преждевременно.

Более того, плохая идея запускать новый поток для каждого запроса, так как это плохо масштабируется (и даже запрещено некоторыми спецификациями). Что тыcan нужно использовать асинхронный запрос Servlet 3.0 и асинхронно обрабатывать загрузку, но предпочтительно с использованием некоторого пула потоков. Смотрите также:Зачем создавать новый поток с startAsync вместо выполнения работы в потоке сервлета?.

... плохая идея, если вам не нужно выполнять какие-то длительные задачи с интенсивным использованием процессора.
@ Tomasz Nurkiewicz, даже если я сохраню работу нового потока внутриdoPost() метод этого сервлета? saplingPro
@grassPro: если ваш поток работает внутриdoPost() (вы ожидаете результата потока, используяjoin()?) в чем смысл темы?
Вы вызвали моё любопытство :) Я попробую кое-что с асинхронными вещами, но у меня возникли некоторые плохие чувства по отношению к клиентской стороне. (Как вернуть результат загрузки?).
@ Tomasz Nurkiewicz Хорошо ли будет отправлять новый запрос другому сервлету из метода run потока, внутри метода post этого сервлета?
-2

поэтому всякий раз, когда какой-либо запрос попадает в сервлет, он выполняется в другом потоке. я не предвижу причину создать новую тему самостоятельно

Таким образом, пользователю не нужно ждать окончания загрузки сервлета
@BigMike Но обычно мы не даем сервлету несколько обязанностей, и если этот сервлет обрабатывает загрузку файла, вы ничего не можете с этим поделать, поэтому вместо создания нового потока я бы сказал, инициировать новый запрос со стороны клиента.
может просто не держать клиента замороженным (если поток занимает много времени?)

Похожие вопросы