Shutting down Netty server when client connections are open -
i'm trying shutdown netty server has open connections it, , hangs. here's do.
- start server on 1 machine , client on another.
- send message client server response.
- shutdown server using ctrl-c
i've registered shutdown hook on server closes channelgroup , calls releaseexternalresources on serverbootstrap (or i'm using duplextcpserverbootstrap of protobuf-pro-duplex library that). anyway, shutdown hook called on shutdown, never returns. when take thread dump of what's happening can see 2 interesting stacks:
java.lang.thread.state: timed_waiting (parking) @ sun.misc.unsafe.park(native method) - parking wait <0x00000006b0890950> (a java.util.concurrent.locks.abstractqueuedsynchronizer$conditionobject) @ java.util.concurrent.locks.locksupport.parknanos(locksupport.java:226) @ java.util.concurrent.locks.abstractqueuedsynchronizer$conditionobject.awaitnanos(abstractqueuedsynchronizer.java:2082) @ java.util.concurrent.threadpoolexecutor.awaittermination(threadpoolexecutor.java:1433) @ org.jboss.netty.util.internal.executorutil.terminate(executorutil.java:103) @ org.jboss.netty.channel.socket.nio.abstractnioworkerpool.releaseexternalresources(abstractnioworkerpool.java:80) @ org.jboss.netty.channel.socket.nio.nioserversocketchannelfactory.releaseexternalresources(nioserversocketchannelfactory.java:162) @ org.jboss.netty.bootstrap.bootstrap.releaseexternalresources(bootstrap.java:319) @ com.googlecode.protobuf.pro.duplex.server.duplextcpserverbootstrap.releaseexternalresources(duplextcpserverbootstrap.java:132) @ com.xxx.yyy.node.nodeserver$2.run(nodeserver.java:104) @ java.lang.thread.run(thread.java:722)
so shutdown hook thread never returns. , below thread seems waiting on channel:
java.lang.thread.state: runnable @ sun.nio.ch.epollarraywrapper.interrupt(native method) @ sun.nio.ch.epollarraywrapper.interrupt(epollarraywrapper.java:274) @ sun.nio.ch.epollselectorimpl.wakeup(epollselectorimpl.java:193) - locked <0x00000006b0896660> (a java.lang.object) @ java.nio.channels.spi.abstractselector$1.interrupt(abstractselector.java:210) @ java.nio.channels.spi.abstractselector.begin(abstractselector.java:216) @ sun.nio.ch.epollselectorimpl.doselect(epollselectorimpl.java:80) @ 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) @ sun.nio.ch.selectorimpl.select(selectorimpl.java:98) @ org.jboss.netty.channel.socket.nio.selectorutil.select(selectorutil.java:52) @ org.jboss.netty.channel.socket.nio.abstractnioworker.run(abstractnioworker.java:208) @ org.jboss.netty.channel.socket.nio.nioworker.run(nioworker.java:38) @ org.jboss.netty.util.threadrenamingrunnable.run(threadrenamingrunnable.java:102) @ org.jboss.netty.util.internal.deadlockproofworker$1.run(deadlockproofworker.java:42) @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1110) @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:603) @ java.lang.thread.run(thread.java:722)
i'm using netty 3.4.6.final java 7.04 on linux. thanks!
br, frank.
had same 'problem' bare netty client/server well.
thing is, closing server channel not close open channels created accepted client connections. 1 has explicitly keep track of client channels in server. can done channel groups , handler adds client channels group. when comes shutting down server, channels in group should closed in batch-like manner instead of 1 server channel (which can put channel group well).
there excellent documentation in user guide (9. shutting down application): http://static.netty.io/3.5/guide/ , channelgroup api doc (simplify shutdown process channelgroup): http://static.netty.io/3.5/api/org/jboss/netty/channel/group/channelgroup.html
Comments
Post a Comment