2017-02-21 24 views
0

环境:ContinuationListener似乎并不被Jetty的ProxyServlet的终止的过滤器链的工作,从8.x的升级后,码头到9.x

  • 在我的环境,Kibana 4.5.2运行背后通过扩展Jetty的“ProxyServlet”类创建的“反向代理servlet”。
  • 这样做是为了使用URL https://Jetty_Server_IP:8443/visual-analytics/proxy/ ...可以访问Kibana网页界面。该URL的请求被在Jetty服务器中运行的反向代理拦截,并被重定向到https://localhost:5601/ ...即,到Kibana服务器与Jetty服务器在同一台机器上运行。
  • Kibana服务器然后处理由Jetty服务器转发的请求并将响应返回给Web浏览器。
  • 注意: Jetty在我的应用程序中以“嵌入模式”运行。

问题:

“反向代理servlet” 被映射到URL “/视觉分析/代理/ *”。

还有一个映射到URL“/visual-analytics/proxy/elasticsearch/.kibana/search/*”的“过滤器”,其中正在使用“ContinuationListener”,如以下代码片断所示:

ContinuationSupport.getContinuation(myRequestWrapper).addContinuationListener(new ContinuationListener() { 

         @Override 
         public void onTimeout(Continuation continuation) { 
          logger.log(Level.WARNING, "Request timeout..."); 
         } 

         @Override 
         public void onComplete(Continuation continuation) { 

          HttpServletResponse httpResponse = (HttpServletResponse)continuation.getServletResponse(); 
          if (httpResponse.getStatus() == HttpServletResponse.SC_OK || httpResponse.getStatus() == HttpServletResponse.SC_CREATED) {                  
            //some business logic 
          } 

         } 
        }); 

    chain.doFilter(myRequestWrapper, response); 

以上ContinuationListener工作正常与码头版本8.1.15.v20140411与收听者的onComplete()方法被调用。但是在将Jetty版本升级到9.3.14.v20161028后,ContinuationListener不再工作,即既没有调用监听器的onComplete()方法也没有调用onTimeout()方法。

任何可能出错的指针或如何进一步调试此问题将不胜感激。期待任何回应...

回答

0

FYI我解决了这个问题,如下所示:

  1. 取代了早期使用Jetty的“ContinuationListener”从Servlet 3.0的“AsyncListener”的方法,因为码头的“ContinuationListener”似乎没有工作后升级到码头9.3.14.v20161028。这可能是一个码头错误。
  2. 与侦听器相关的代码段位于筛选器的“chain.doFilter()”调用之前。我将此代码段移至过滤器的“chain.doFilter()”调用后面,以便我可以检索Jetty ProxyServlet的service()方法中“已创建”的AsyncContext。然后,我可以将AsyncListener添加到检索到的AsyncContext中。
  3. 而不是在我的过滤器中使用“request.startAsync()”调用,我使用“request.getAsyncContext()”,这样我就不会启动一个新的AsyncContext导致IllegalStateException,但只检索AsyncContext这已经在Jetty的ProxyServlet中创建。

所以更新的代码段看起来是这样的:

 chain.doFilter(myRequestWrapper, response); 

     AsyncContext asyncContext = myRequestWrapper.getAsyncContext(); 
     asyncContext.addListener(new AsyncListener() { 

      @Override 
      public void onTimeout(AsyncEvent event) throws IOException 
      { 
         logger.log(Level.WARNING, "Async timeout..."); 
      } 

      @Override 
      public void onStartAsync(AsyncEvent event) throws IOException 
      { 
         logger.log(Level.INFO, "Async start..."); 
      } 

      @Override 
      public void onError(AsyncEvent event) throws IOException 
      { 
         logger.log(Level.SEVERE, "Async error..."); 
      } 

      @Override 
      public void onComplete(AsyncEvent event) throws IOException 
      { 
        HttpServletResponse httpResponse = (HttpServletResponse) event.getAsyncContext().getResponse(); 
        if (httpResponse.getStatus() == HttpServletResponse.SC_OK || httpResponse.getStatus() == HttpServletResponse.SC_CREATED) { 
           //some business logic 
        } 
      } 
     }, myRequestWrapper, httpServletResponse);