2014-05-17 8 views
0

CXF에서 구현 된 REST API를 노출하는 스프링 응용 프로그램이 있습니다. 나는 긴 폴링을 구현하려고하는데, 과 함께 Suspended을 사용했습니다. tomcat (maven plugin 또는 standalone)에서이 코드 조각을 실행하면 작동합니다. 그러나 maven plugin (mvn jetty : run)을 사용하여 부두에서 동일한 코드를 실행하면 실패합니다. CXF가 NPE를 던졌습니다. 내가 그것을 디버깅하고 그 ContinuationProvider가 요청에 대해 설정되지 않은 것을 보았다. 그래서 추가 디버깅을 통해 부티크는 내부적으로 Request 객체에서 AsyncSupport 부울 변수를 false로 설정하고 필터를 적용한 다음 finally 블록에서 다시 true로 설정하는 것으로 나타났습니다. 그러나 필터 체인에는 서블릿도 포함되어 있으므로 서블릿이 AsyncSupport false로 요청을 해석하게합니다. 부두의 코드베이스Jetty 9, AsyncResponse not working

@Override 
    public void doFilter(ServletRequest request, ServletResponse response) 
     throws IOException, ServletException 
    { 
     final Request baseRequest=(request instanceof Request)?((Request)request):HttpChannel.getCurrentHttpChannel().getRequest(); 

     // pass to next filter 
     if (_filterHolder!=null) 
     { 
      if (LOG.isDebugEnabled()) 
       LOG.debug("call filter " + _filterHolder); 
      Filter filter= _filterHolder.getFilter(); 
      if (_filterHolder.isAsyncSupported()) 
       filter.doFilter(request, response, _next); 
      else 
      { 
       final boolean suspendable=baseRequest.isAsyncSupported(); 
       if (suspendable) 
       { 
        try 
        { 
         baseRequest.setAsyncSupported(false); 
         filter.doFilter(request, response, _next); 
        } 
        finally 
        { 
         baseRequest.setAsyncSupported(true); 
        } 
       } 
       else 
        filter.doFilter(request, response, _next); 
      } 
      return; 
     } 

에서

부두 받는다는 플러그인 버전 9.1.3vxxxxxx ServletHandler.java 이유는 필터 체인은 서블릿 포함되어 있습니까? doFilter보다 reuest가 수정되기 시작하는 이유는 무엇입니까? 부두 Maven 플러그인에서 어떻게 작동 시키나요?

답변

0

발견. 모든 요청에 ​​대해 필터 (Log4jServletFilter)를 자동으로 등록하는 Log4jServletContainerInitializer를 사용했습니다. 여기에서 문제는 내가 사용하고 있던 버전에 있었다. Log4j2.0-beta-9 (문제), Log4jServletFilter를 등록 할 때 AsyncSupport (즉, async 지원 true)로 등록되지 않은 것이 문제였습니다. 그래서 나는 문제를 sloved log4j2.0 - rc1로 업그레이 드합니다. :)