Как использовать Servlet 3 @WebServlet и async с Spring MVC 3?

Я хотел бы интегрировать поддержку асинхронного режима сервлета 3.0 с Spring MVC. Что-то вроде:

@RequestMapping("/chat")
@WebServlet(name="myServlet", asyncSupported=true)
public String getMessage(String userName) {
      ......
}

Является ли это возможным?


person Ben    schedule 27.07.2010    source источник


Ответы (5)


Не так быстро, не так-то просто реализовать хороший длинный опрос. Упомянутый вами метод работает хорошо, но существует серьезная проблема "голодания потоков".

Каждый длинный опрос будет использовать один поток, если у вас есть 1000 одновременных пользователей, вам понадобится 1000 потоков для обслуживания длинного запроса на опрос (который в большинстве случаев обновляет статус на стороне сервера в браузере клиента)

Jetty 6 имеет шаблон продолжения, который ловко освобождает поток длинного запроса на опрос, который будет использоваться реальной логикой приложения.

person Krish Bheeman    schedule 29.10.2010
comment
И Jetty 7, текущий выпуск в середине 2011 года полностью поддерживает это. Я также ищу текущий статус в Spring Support. - person David Parks; 27.07.2011

Еще не реализовано в Spring Framework 3.x. См. https://jira.springframework.org/browse/SPR-5587 и https://jira.springsource.org/browse/SPR-8517

Если вам нужна поддержка комет (длинный опрос ajax), вы "можете" попробовать CometD (http://cometd.org/documentation/cometd-java/server/services/integration-spring). Но предупреждаю, что уронила, просто до раздутости! (Такая простая вещь, как длинный опрос, требует нескольких дней настройки ??!)

Я бы просто реализовал несколько контроллеров RESTful в Spring3 и запрограммировал бы себе длинный опрос. Сделайте запрос в стиле Ajax на сервер, ваш контроллер будет держать его открытым до тех пор, пока у сервера не появятся новые данные для отправки в браузер. Браузер инициирует новый длинный запрос на опрос, чтобы получить последующие события. Чтобы избежать тайм-аутов соединения, просто возвращайте фиктивные значения, которые заставляют клиента повторять запрос.

Простой легкий путь - в большинстве случаев лучшее решение.

person monzonj    schedule 27.08.2010
comment
Должен быть реализован для Spring 3.1.0, которая была выпущена, но согласно jira.springsource.org/browse / SEC-1685 он был перемещен в 3.2.0 ... однако, поддержка Servlet 3.0 является широким понятием, и это не обязательно означает, что также будет реализована асинхронная обработка. - person Danubian Sailor; 28.12.2011

Вопрос довольно старый, но до сих пор без ответа. Автор хотел, чтобы в Spring MVC была поддержка асинхронности, но решение до сих пор не дано.

Как указывалось в предыдущем ответе, запрос на поддержку async был отправлен в систему отслеживания ошибок сообщества Spring и должен был быть реализован в Spring 3.1.0. Он был выпущен недавно, но, согласно примечаниям к выпуску, "поддержка сервлетов 3.0" планируется сделать в версии 3.2.0: https://jira.springsource.org/browse/SEC-1685

Мне нужна высокоэффективная COMET для моего приложения. Моя текущая реализация основана на следующем примере: http://code.google.com/p/jquery-stream/wiki/EchoExample, но я заинтересован в переносе его на контроллер Spring MVC. На данный момент я только что улучшил пример и вручную ввел туда Spring beans, чтобы обеспечить связь с остальной частью приложения. У меня были некоторые проблемы, описанные в моем вопросе: Ошибка асинхронной обработки Tomcat 7 - одновременно обрабатывается только один запрос. Пока все работает нормально.

Я нашел пример, в котором используются решения jboss: http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Asynchronous_HTTP_Request_Processing.html, но использование jboss для меня не является решением. JBoss слишком большой, медленный и сложный для развития.

person Danubian Sailor    schedule 28.12.2011

Вы можете сделать это прямо сейчас с помощью фантастической библиотеки Atmosphere:

Вот пример Spring MVC: https://github.com/ghillert/atmosphere-spring-web-mvc

person Adam Gent    schedule 25.04.2012

Поддержка асинхронного режима Servlet 3.0 в настоящее время рассматривается. Если у вас есть конкретные сценарии, которые вы хотели бы увидеть, оставьте комментарий в разделе SPR-8517. или посмотрите билет и следите за обсуждением.

person Rossen Stoyanchev    schedule 26.01.2012