2017-05-16 1 views
1

Objectif: Avoir une application Web Spring avec une Jetty intégrée, je voudrais arrêter/redémarrer l'application gracieusement.
Voici le haricot EmbeddedServletContainerFactory (je vais ajouter le code omis si nécessaire):Spring + Jetty: fermeture gracieuse

@Bean 
public EmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() { 
    JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory(); 
    factory.addServerCustomizers(server -> { 

     server.setStopAtShutdown(false); 

     /* 
     * StatisticsHandler has to be added for graceful shutdown to work (see 
     * https://github.com/eclipse/jetty.project/issues/1549#issuecomment-301102535) 
     */ 
     StatisticsHandler statisticsHandler = new StatisticsHandler(); 
     statisticsHandler.setHandler(server.getHandler()); 
     server.setHandler(statisticsHandler); 
    }); 
    return factory; 
} 

et voici notre gestionnaire de signal d'arrêt:

@Component 
public class ShutdownSignalHandler { 

    @Value("${shutdown.signalType:TERM}") 
    private String signal; 

    @Autowired 
    private ConfigurableApplicationContext context; 

    @Autowired 
    private Server jetty; 

    @PostConstruct 
    public void init() { 
     Signal.handle(new Signal(signal), this::signalHandler); 
    } 

    private void signalHandler(Signal signal) { 
     jetty.stop(); 
     context.close(); 
    } 
} 

Question: ayant la configuration ci-dessus, chaque fois que je remets en marche l'application via TERM signal, je vois beaucoup de 503 entrées dans apache_access log (presque tous se produisent pendant que jetty.stop est en cours d'exécution).
Une idée comment/pourquoi cela arrive et quelle est la résolution?

Répondre

1

Pourquoi/comment cela se passe-t-il? Eh bien, c'est le comportement par défaut de Jetty: Premièrement, Jetty ferme les connecteurs réseau pour arrêter d'accepter de nouvelles connexions et attendre que la demande active soit traitée. Mais le problème est que les nouvelles requêtes peuvent être envoyées à Jetty par des connexions déjà établies (celles qui sont connectées avant le démarrage du processus d'arrêt).
Solutions: Envoyer une nouvelle tentative pour les nouvelles demandes envoyées sur des connexions ouvertes. Nous avons personnalisé StatisticsHandler afin que, pendant le processus d'arrêt au lieu de traiter la demande avec 503, il les gère avec 307 Connection: close, Location: <original-url>.

MISE À JOUR: ce que nous avons fait était de changer la mise en œuvre de la méthode handle de la classe StatisticsHandler (Rechercher Change this line! commentaire):

@Override 
public void handle(String path, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException 
{ 
    ... 
    try 
    { 
     Handler handler = getHandler(); 
     if (handler!=null && _shutdown.get()==null && isStarted()) 
      handler.handle(path, baseRequest, request, response); 
     else if (baseRequest.isHandled()) 
     { 
      if (_wrapWarning.compareAndSet(false,true)) 
       LOG.warn("Bad statistics configuration. Latencies will be incorrect in {}",this); 
     } 
     else 
     { 
      baseRequest.setHandled(true); 
      response.sendError(HttpStatus.SERVICE_UNAVAILABLE_503); // Change this line! 
     } 
    } 
    finally 
    { 
     ... 
    } 
} 
+0

Peut-être que vous pouvez publier votre personnalisation de StatisticsHandler ici? –

+1

@MarkusSchulte J'ai ajouté la partie à modifier. Ce n'est pas quelque chose de spécial. Je viens de changer la ligne avec ce que nous voulions. Juste un petit commentaire: je n'ai pas essayé de l'étendre à cause du flux de manutention compliqué. J'ai copié l'ensemble du code et modifié l'implémentation. – Rad

-1

503 - Service non disponible

Apache ne peut pas obtenir une réponse quand la demande mandatement au conteneur de servlet car, il n'y a pas de conteneur servlet écoute sur l'hôte: port spécifié dans la configuration du proxy.

+1

Nous n'avons pas Apache. Merci. – Rad

+0

Je pensais que vous l'avez fait depuis que vous avez mentionné "beaucoup de 503 entrées dans le journal apache_access" – ootero

+0

Eh bien, c'est le nom que le gestionnaire de journal de Jetty utilise. – Rad