Как использовать Servlet 3 @WebServlet & async с Spring MVC 3? - PullRequest
12 голосов
/ 27 июля 2010

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

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

возможно ли это?

Ответы [ 6 ]

4 голосов
/ 29 октября 2010

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

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

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

3 голосов
/ 27 августа 2010

Еще не реализовано в 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 на сервер, ваш контроллер будет держать его открытым, пока на сервере не появятся новые данные для отправки в браузер. Браузер инициирует новый длинный запрос опроса для получения последующих событий. Чтобы избежать тайм-аутов соединения, просто верните фиктивные значения, которые заставляют клиента повторять запрос.

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

2 голосов
/ 28 декабря 2011

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

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

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

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

1 голос
/ 25 апреля 2012

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

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

0 голосов
/ 12 января 2019

Да, вы можете использовать сейчас. Вы должны добавить класс ApplicationInitializer, который расширяет класс AbstractAnnotationConfigDispatcherServletInitializer .

package co.tellmehow.config
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ApplicationInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {

  @Override
    protected Class<?>[] getRootConfigClasses () {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses () {
        return new Class<?>[]{ApplicationWebConfig.class};
    }
    @Override
    protected String[] getServletMappings () {
        return new String[]{"/"};
    }
}

Мы должны расширить класс AbstractAnnotationConfigDispatcherServletInitializer, который используется, когда иерархия контекста приложения не требуется, приложения могут возвращать всю конфигурацию через getRootConfigClasses () и возвращать ноль из getServletConfigClasses () .

Теперь вы можете использовать аннотацию @WebServlet с приложением Spring.

Полный исходный код с пояснениями представлен здесь.

@WebServlet(name = "myServlet", urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {


    private static final long serialVersionUID = 7088410241741084414L;

    @Override
    protected void doGet (HttpServletRequest req,
                          HttpServletResponse resp)
              throws ServletException, IOException {

        System.out.println("-- In MyServlet --");
        PrintWriter writer = resp.getWriter();
        writer.println("Tell Me How: MyServlet running now");
    }
}
0 голосов
/ 27 января 2012

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

...