L'arrêt de Netty serveur lorsque le client connexions sont ouvertes
Je suis en train de l'arrêt d'un Netty serveur qui a ouvert ses connexions, et il se bloque. Voici ce que je fais.
- Démarrer le serveur sur une machine et le client sur un autre.
- Envoyer un message à partir du serveur vers le client pour lequel je reçois une réponse.
- Arrêt du serveur à l'aide de Ctrl-C
J'ai enregistré un arrêt de crochet sur le serveur ferme la ChannelGroup et les appels releaseExternalResources sur le ServerBootstrap (ou en fait, je suis en utilisant le DuplexTcpServerBootstrap de la protobuf-pro-duplex bibliothèque qui ne fait que cela). De toute façon, la fermeture hook est appelé correctement lors de l'arrêt, mais il ne revient jamais. Quand je prends un thread dump de ce qui se passe, je peut voir deux piles:
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006b0890950> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
at java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1433)
at org.jboss.netty.util.internal.ExecutorUtil.terminate(ExecutorUtil.java:103)
at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.releaseExternalResources(AbstractNioWorkerPool.java:80)
at org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory.releaseExternalResources(NioServerSocketChannelFactory.java:162)
at org.jboss.netty.bootstrap.Bootstrap.releaseExternalResources(Bootstrap.java:319)
at com.googlecode.protobuf.pro.duplex.server.DuplexTcpServerBootstrap.releaseExternalResources(DuplexTcpServerBootstrap.java:132)
at com.xxx.yyy.node.NodeServer$2.run(NodeServer.java:104)
at java.lang.Thread.run(Thread.java:722)
Donc, c'est la fermeture de crochet de fil qui ne revient jamais. Et ci-dessous est un autre thread qui semble être en attente sur un canal:
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.interrupt(Native Method)
at sun.nio.ch.EPollArrayWrapper.interrupt(EPollArrayWrapper.java:274)
at sun.nio.ch.EPollSelectorImpl.wakeup(EPollSelectorImpl.java:193)
- locked <0x00000006b0896660> (a java.lang.Object)
at java.nio.channels.spi.AbstractSelector$1.interrupt(AbstractSelector.java:210)
at java.nio.channels.spi.AbstractSelector.begin(AbstractSelector.java:216)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:80)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
- locked <0x00000006b08964a8> (a sun.nio.ch.Util$2)
- locked <0x00000006b0896498> (a java.util.Collections$UnmodifiableSet)
- locked <0x00000006b0890d20> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)
at org.jboss.netty.channel.socket.nio.SelectorUtil.select(SelectorUtil.java:52)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:208)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:38)
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102)
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Je suis en utilisant Netty 3.4.6.Final avec Java 7.04 sur Linux. Merci!
Br,
Frank.
OriginalL'auteur frank.durden | 2012-06-06
Vous devez vous connecter pour publier un commentaire.
Eu le même "problème" avec les Netty client/serveur.
Chose est, la fermeture du serveur de canal NE PAS fermer les canaux créés pour accepté les connexions client. On a explicitement garder une trace de canal client dans le serveur. Cela peut être fait avec des groupes de canaux et un gestionnaire qui ajoute client chaînes de ce groupe.
Quand il s'agit d'arrêter le serveur, tous les canaux du groupe devrait être fermé dans un lot comme il se doit au lieu de juste un serveur de canal (qui peut mettre dans le groupe de canaux).
Y est excellente documentation dans le guide de l'utilisateur (9. La fermeture de Votre Application): http://static.netty.io/3.5/guide/ et la ChannelGroup doc API (Simplifier le processus d'arrêt avec ChannelGroup): http://static.netty.io/3.5/api/org/jboss/netty/channel/group/ChannelGroup.html
OriginalL'auteur Horst Dehmer
J'ai eu le même problème et résolu.
Vous devez arrêter tous les
EventLoopGroup
de façon synchrone et ensuite fermer le port.Il peut prendre de 4 à 5 secondes complètement à l'arrêt.
Voici un exemple de code (je pense que vous devriez faire à une interface simple avec démarrer et stop bouton pour tester):
Remarque: Vous pouvez modifier
EpollEventLoopGroup
à toutEventLoopGroup
vous le souhaitez.OriginalL'auteur thangdc94
Netty De L'Arrêt Du Serveur
Exemple de code
OriginalL'auteur Jini Kim