2017-08-05 4 views
0

J'ai un serveur simple basé sur Grizzly NIO. Je commence/l'arrêter comme suit, s'il vous plaît noter le commentaire près de la méthode d'arrêt:Le serveur ne se ferme pas normalement en raison d'une incompatibilité de concurrence

public class MyServer { 

public static void main(String[] args) { 
    try { 

     HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create("someURL"), resourceConfig, false); 
     Runtime.getRuntime().addShutdownHook(new Thread(() -> { 
      server.shutdownNow(); 
     })); 

     server.start(); 
     Thread.currentThread().join(); 
     server.shutdown(); //this line is never reached 
    } catch (IOException | InterruptedException ex) { 
     //exception handling 
    } 
} 
} 

Lorsque je termine le serveur, il obtient immédiatement l'arrêt depuis la ligne server.shutdown() est jamais atteint au lieu de une manière gracieuse. Cela étant dit, j'ai essayé d'implémenter un hameçon d'arrêt, mais je ne l'ai pas appelé non plus. Je me doute de ma mise en œuvre join() mais je ne suis pas sûr à ce sujet. Toute aide pour réaliser une fermeture gracieuse serait appréciée.

Répondre

1

Thread.currentThread().join() va bloquer pour toujours. Il attend pour lui-même pour finir mais ne peut pas finir parce qu'il attend lui-même pour finir.

+0

suggérez-vous un mécanisme correct pour le manipuler? –

+0

@johndoe Je ne vois pas pourquoi vous avez ça du tout. Vous courez en main, il n'y a pas besoin de la jointure. –

+0

étant donné qu'il s'agit d'une implémentation serveur, j'utilise l'API de Grizzly, je la démarre, puis je veux la fermer avec élégance. –