0

Umwelt bis 9.x:ContinuationListener scheint nicht in einer Filterkette von Jetty des ProxyServlet beendet zu arbeiten, nachdem Jetty von 8.x Upgrade

  • In meiner Umgebung, Kibana 4.5.2 hinter läuft ein "Reverseproxy-Servlet", das durch Erweitern der "ProxyServlet" -Klasse von Jetty erzeugt wird. Diese
  • erfolgt so, dass die Kibana Webinterface mit der URL zugegriffen werden kann https://Jetty_Server_IP:8443/visual-analytics/proxy/ ... Anfragen für diese URL werden durch den Reverse-Proxy in dem Jetty Server ausgeführt wird abgefangen und umgeleitet https://localhost:5601/ ... dh zum Kibana Server Das läuft auf demselben Rechner wie der Jetty Server.
  • Der Kibana-Server verarbeitet dann die vom Jetty-Server weitergeleitete Anfrage und gibt die Antwort an den Webbrowser zurück.
  • HINWEIS: Jetty läuft im "eingebetteten Modus" innerhalb meiner Anwendung.

Ausgabe:

Das "Reverse-Proxy-Servlet" an die URL zugeordnet "/ Visual-Analytics/proxy/*".

Es gibt einen weiteren "Filter", der der URL "/visualanalytics/proxy/elasticsearch/.kibana/search/*" zugeordnet ist, in der ein "ContinuationListener" verwendet wird, wie im folgenden Codefragment angegeben:

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

Die oben ContinuationListener mit Jetty Version 8.1.15.v20140411 funktionierte gut und die onComplete() -Methode des Zuhörers genannt wurde. Aber nach dem Aktualisieren der Jetty-Version auf 9.3.14.v20161028 funktioniert der ContinuationListener nicht mehr, d. H., Weder die onComplete() - Methode noch die onTimeout() -Methode des Listeners wird aufgerufen.

Irgendwelche Hinweise darauf, was schief gelaufen sein könnte oder wie dieses Problem weiter zu debuggen wäre, würde sehr geschätzt werden. Wir freuen uns für jede Antwort ...

Antwort

0

FYI ich dieses Problem wie folgt festgelegt:

  1. ersetzt die frühere Ansatz der Verwendung von Jetty des „ContinuationListener“ mit Servlet 3.0 des „AsyncListener“, da Jetty des „ContinuationListener“ scheint nach dem Upgrade auf Jetty 9.3.14.v20161028 nicht zu funktionieren. Dies kann ein Jetty Bug sein.
  2. Das Listener-bezogene Code-Segment wurde vor dem Aufruf "chain.doFilter()" des Filters gefunden. Ich habe dieses Code-Segment an eine Position NACH dem Filter "chain.doFilter()" des Filters verschoben, so dass ich den AsyncContext abrufen kann, der in der service() - Methode des Jetty ProxyServlet "bereits erstellt" ist. Ich kann dann einen AsyncListener zum abgerufenen AsyncContext hinzufügen.
  3. Anstatt den Aufruf "request.startAsync()" in meinem Filter zu verwenden, verwende ich "request.getAsyncContext()", sodass ich keinen neuen AsyncContext starte, der zu einer IllegalStateException führt, sondern nur den AsyncContext abruft Das ist bereits in Jetty's ProxyServlet erstellt.

So ist der aktualisierte Code-Segment sieht wie folgt aus:

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