0

Environnement:ContinuationListener ne semble pas fonctionner dans une chaîne de filtre terminée par ProxyServlet de la jetée, après la mise à niveau de la jetée 8.x à 9.x

  • Dans mon environnement, Kibana 4.5.2 est en retard un "servlet proxy inverse" qui est créé en étendant la classe "ProxyServlet" de Jetty.
  • Ceci est fait pour que l'interface Web de Kibana soit accessible en utilisant l'URL https://Jetty_Server_IP:8443/visual-analytics/proxy/ ... Les demandes pour cette URL sont interceptées par le proxy inverse fonctionnant dans le serveur Jetty et redirigé vers https://localhost:5601/ ... ie, vers le serveur Kibana qui s'exécute dans la même machine que le serveur Jetty.
  • Le serveur Kibana traite ensuite la demande transmise par le serveur Jetty et renvoie la réponse au navigateur Web.
  • REMARQUE: Jetty fonctionne en "mode intégré" dans mon application.

Problème:

Le "servlet proxy inverse" est mis en correspondance avec l'URL "/ visuel-analytique/proxy/*".

Il existe un autre "filtre" qui est mappé à l'URL "/visual-analytics/proxy/elasticsearch/.kibana/search/*" dans lequel un "ContinuationListener" est utilisé comme indiqué par l'extrait de code suivant:

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

le ContinuationListener ci-dessus fonctionnait très bien avec la version jetée 8.1.15.v20140411 et méthode onComplete() de l'auditeur est appelé. Mais après la mise à niveau de la version Jetty vers 9.3.14.v20161028, ContinuationListener ne fonctionne plus, c'est-à-dire que ni la méthode onComplete() de l'écouteur ni la méthode onTimeout() ne sont appelées.

Tout pointeur sur ce qui pourrait avoir mal tourné ou comment déboguer ce problème serait grandement apprécié. Perspectives d'avenir pour toute réponse ...

Répondre

0

Pour votre information, je résolu ce problème comme suit:

  1. Remplacée l'approche antérieure en utilisant « ContinuationListener » avec la « AsyncListener », puisque « ContinuationListener » de la jetée de Servlet 3.0 de la jetée ne semble pas fonctionner après la mise à niveau vers Jetty 9.3.14.v20161028. Cela peut être un bug Jetty.
  2. Le segment de code associé à l'écouteur se trouvait AVANT l'appel "chain.doFilter()" du filtre. J'ai déplacé ce segment de code à une position après l'appel "chain.doFilter()" du filtre, de sorte que je puisse récupérer le AsyncContext qui est "déjà créé" dans la méthode service() de Jetty ProxyServlet. Je peux ensuite ajouter un AsyncListener à l'AsyncContext récupéré. Au lieu d'utiliser l'appel "request.startAsync()" dans mon filtre, j'utilise le "request.getAsyncContext()" pour que je ne démarre pas un nouveau AsyncContext qui mène à une exception IllegalStateException, mais qui récupère uniquement le AsyncContext qui est déjà créé dans ProxyServlet de Jetty.

Ainsi, le segment de code mis à jour ressemble à ceci:

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