2016-06-19 3 views
1

Je voudrais fermer le socket serveur sur un serveur Netty, puis attendre que tous les enfants aient terminé le traitement avant d'exécuter le nettoyage des ressources.Netty ServerSocket et les enfants Graceful Shutdown

Etape 1 Attendre le socket serveur Netty pour fermer sur le fil principal en utilisant ce code où b est une instance de ServerBootstrap

b.bind (getPort (p)).sync().channel().closeFuture().sync() 

Etape 2 charger le socket serveur pour fermer de un fil différent, quelque part dans l'application

Étape 3 Instruire tous les clients à l'arrêt, je vais avoir le code d'application qui le fera

Étape 4 Attendez que tous les sockets client pour fermer, ce que je veux savoir comment faire. Comment puis-je obtenir une liste de toutes les sockets client, enfants du serveur, puis attendre que tous les sockets soient fermés?

Version Netty 4.1.1.Final

je configurer le socket serveur Netty en utilisant le code suivant

EventLoopGroup bossGroup = new NioEventLoopGroup (1); 
EventLoopGroup workerGroup = new NioEventLoopGroup (Math.max (1, Runtime.getRuntime().availableProcessors()/2)); 
try 
{ 
    ServerBootstrap b = new ServerBootstrap(); 
    b.group (bossGroup, workerGroup) 
    .channel (NioServerSocketChannel.class) 
    .childHandler (new ServerInitializer (sslctx, jsonIOManager, dispatcherPool, factory)) 
    .childOption (ChannelOption.TCP_NODELAY, Boolean.TRUE) 
    .childOption (ChannelOption.SO_KEEPALIVE, Boolean.TRUE); 

    // wait till server socket is closed  
    b.bind (getPort (p)).sync().channel().closeFuture().sync(); 
    // instruct all clients to shutdown 
    dispatcherPool.shutdown(); 

    // wait on all sockets that are children of the server socket to close 
    // How can i do this? 

} 
finally 
{ 
    bossGroup.shutdownGracefully(); 
    workerGroup.shutdownGracefully(); 
} 

Répondre

1

De l'netty 4.x user guide il semble que simplement attendre jusqu'à ce que le retour ne shutdownGracefully attendre toutes les prises sont fermées.

une application Arrêt Netty est généralement aussi simple que la fermeture vers le bas tous les EventLoopGroups créés par shutdownGracefully(). renvoie un Avenir qui vous avertit lorsque le bloc d'événements a été terminé complètement et que tous les canaux appartenant au groupe ont été fermés .