복붙노트

[SPRING] Servlet 3 @WebServlet과 async를 Spring MVC 3와 함께 사용하는 방법?

SPRING

Servlet 3 @WebServlet과 async를 Spring MVC 3와 함께 사용하는 방법?

스프링 MVC와 함께 서블릿 3.0 비동기 지원을 통합하고자합니다. 같은 것 :

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

그것은 가능한가?

해결법

  1. ==============================

    1.너무 빠르지 않고 좋은 긴 폴링을 구현하는 것이 쉽지 않습니다. 언급 한 방법은 잘 작동하지만 "스레드 기아"라는 심각한 문제가 있습니다.

    너무 빠르지 않고 좋은 긴 폴링을 구현하는 것이 쉽지 않습니다. 언급 한 방법은 잘 작동하지만 "스레드 기아"라는 심각한 문제가 있습니다.

    각 Long 폴링은 하나의 스레드를 사용합니다. 1000 명의 동시 사용자가있는 경우 긴 폴링 요청을 처리하려면 1000 스레드가 필요합니다 (대부분 클라이언트 브라우저에서 서버 측 상태를 업데이트합니다)

    Jetty 6는 실제 응용 프로그램 논리에서 사용하기 위해 긴 폴링 요청의 스레드를 영리하게 해제하는 계속 패턴을 갖습니다.

  2. ==============================

    2.Spring Framework 3.x에서는 아직 구현되지 않았습니다. https://jira.springframework.org/browse/SPR-5587 및 https://jira.springsource.org/browse/SPR-8517을 참조하십시오.

    Spring Framework 3.x에서는 아직 구현되지 않았습니다. https://jira.springframework.org/browse/SPR-5587 및 https://jira.springsource.org/browse/SPR-8517을 참조하십시오.

    원하는 것이 혜성 지원 (long-polling ajax)이라면 CometD (http://cometd.org/documentation/cometd-java/server/services/integration-spring)를 시도 할 수 있습니다. 그러나 나는 내가 그것을 떨어 뜨렸다 고 경고한다, 그것은 단지 비 대한 것이다! (긴 폴링과 같은 단순한 작업에는 구성 일이 필요합니다.)!

    나는 Spring3에서 몇몇 RESTful 컨트롤러를 구현하고 스스로 긴 폴링을 프로그래밍 할 것이다. Ajax 스타일 요청을 서버에 보내면 컨트롤러는 서버에 브라우저에 보낼 새 데이터가있을 때까지 계속 열어 둡니다. 브라우저는 후속 이벤트를 얻기 위해 새로운 긴 폴링 요청을 시작합니다. 연결 시간 초과를 피하기 위해 클라이언트가 요청을 반복하도록하는 더미 값을 반환하면됩니다.

    평범한 쉬운 방법은 대부분의 시간에 최고의 솔루션입니다.

  3. ==============================

    3.질문은 꽤 오래되었지만 여전히 답이 없습니다. 저자는 Spring MVC에서 비동기 지원을 원했고 솔루션은 아직 제공되지 않았습니다.

    질문은 꽤 오래되었지만 여전히 답이 없습니다. 저자는 Spring MVC에서 비동기 지원을 원했고 솔루션은 아직 제공되지 않았습니다.

    이전 답변에서 언급했듯이 비동기 지원 요청은 스프링 커뮤니티 버그 추적기에 제출되었으며 Spring 3.1.0에서 구현되었습니다. 이것은 최근에 발표되었지만 릴리즈 노트에 따르면 "Servlet 3.0 support"는 버전 3.2.0에서 만들어 질 예정입니다 : https://jira.springsource.org/browse/SEC-1685

    내 응용 프로그램에 매우 효율적인 COMET이 필요합니다. 현재 구현은 다음 예제를 기반으로합니다 : http://code.google.com/p/jquery-stream/wiki/EchoExample,하지만 스프링 MVC 컨트롤러로 이동하는 데 관심이 있어요. 지금까지 예제를 개선하고 스프링 빈을 수동으로 주입하여 나머지 응용 프로그램과의 통신을 허용했습니다. Tomcat 7 비동기 처리에 실패했습니다. 단 하나의 요청 만이 동시에 처리되었습니다. 현재로서는 잘 작동합니다.

    jboss 솔루션을 사용하는 예제를 발견했습니다. http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Asynchronous_HTTP_Request_Processing.html, jboss를 사용하는 것은 해결책이 아닙니다. JBoss는 너무 크고 너무 느리고 개발하기가 너무 어렵습니다.

  4. ==============================

    4.환상적인 Atmosphere 라이브러리로이 작업을 수행 할 수 있습니다.

    환상적인 Atmosphere 라이브러리로이 작업을 수행 할 수 있습니다.

    다음은 Spring MVC 예제이다. https://github.com/ghillert/atmosphere-spring-web-mvc

  5. ==============================

    5.Servlet 3.0 비동기 지원이 현재 고려 중입니다. SPR-8517의 특정 시나리오가 있으시면 SPR-8517로 의견을 말 하시거나 티켓을 보시고 토론을 따르십시오.

    Servlet 3.0 비동기 지원이 현재 고려 중입니다. SPR-8517의 특정 시나리오가 있으시면 SPR-8517로 의견을 말 하시거나 티켓을 보시고 토론을 따르십시오.

  6. ==============================

    6.예, 지금 사용할 수 있습니다. AbstractAnnotationConfigDispatcherServletInitializer 클래스를 확장하는 ApplicationInitializer 클래스를 추가해야합니다.

    예, 지금 사용할 수 있습니다. AbstractAnnotationConfigDispatcherServletInitializer 클래스를 확장하는 ApplicationInitializer 클래스를 추가해야합니다.

    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 ()에서 null을 반환 할 수 있습니다.

    이제 스프링 애플리케이션에서 @WebServlet 어노테이션을 사용할 수있다.

    설명이있는 전체 소스 코드가 여기에 있습니다.

    @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");
        }
    }
    
  7. from https://stackoverflow.com/questions/3345302/how-to-use-servlet-3-webservlet-async-with-spring-mvc-3 by cc-by-sa and MIT license