2017-02-21 31 views
0

среды:ContinuationListener не похоже на работу в цепочке фильтров завершенного ProxyServlet Jetty, в после обновления Jetty от 8.x до 9.x

  • В моей среде, Kibana 4.5.2 работает за «обратный прокси-сервлет», который создается путем расширения класса «ProxyServlet» Jetty.
  • Это делается для доступа к веб-интерфейсу Kibana с помощью URL-адреса https://Jetty_Server_IP:8443/visual-analytics/proxy/ ... Запросы на этот URL-адрес перехватываются обратным прокси-сервером, запущенным на сервере Jetty Server, и перенаправляются на https://localhost:5601/ ... т.е. на сервер Kibana который работает на том же компьютере, что и Jetty Server.
  • Затем сервер Kibana обрабатывает запрос, перенаправленный сервером Jetty, и возвращает ответ обратно в веб-браузер.
  • ПРИМЕЧАНИЕ: Jetty работает в «встроенном режиме» в моем приложении.

Выпуск:

"обратный прокси-сервлет" отображаются в 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 работает нормально с Jetty версии 8.1.15.v20140411 и метод слушателя OnComplete() был при вызове. Но после обновления версии Jetty до 9.3.14.v20161028, ContinuationListener больше не работает, то есть не вызывается ни метод onComplete() слушателя, ни метод onTimeout().

Любые указатели на то, что могло пойти не так, или как отладить этот вопрос, были бы весьма признательны. Глядя вперед для любого ответа ...

ответ

0

FYI Я исправил эту проблему следующим образом:

  1. Заменены ранее подход с использованием Jetty в «ContinuationListener» с Servlet 3.0 в «AsyncListener», так как Jetty в «ContinuationListener» похоже, не работает после обновления до Jetty 9.3.14.v20161028. Это может быть ошибка Jetty.
  2. Сегмент кода, связанный с прослушивателем, был расположен ПЕРЕД вызовом «chain.doFilter()» фильтра. Я переместил этот сегмент кода в позицию ПОСЛЕ вызова «chain.doFilter()» фильтра, чтобы я мог получить AsyncContext, который уже создан в методе service() Jetty ProxyServlet. Затем я могу добавить AsyncListener в извлеченный AsyncContext.
  3. Вместо использования вызова «request.startAsync()» в моем фильтре я использую «request.getAsyncContext()», так что я не запускаю новый AsyncContext, который приводит к исключению IllegalStateException, но только для получения AsyncContext который уже создан в ProxyServlet Jetty.

Так обновленный сегмент кода выглядит следующим образом:

 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^