Netty ServerSocket和儿童优雅关机

时间:2016-06-19 00:29:41

标签: java server netty application-shutdown

我想在Netty服务器上关闭服务器套接字,然后在执行资源清理之前等待所有子进程完成处理。

第1步 等待使用此代码在主线程上关闭Netty服务器套接字,其中bServerBootstrap的实例

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

第2步 指示服务器套接字从应用程序中其他位置的其他线程关闭

第3步 指示所有客户端关闭,我将有应用程序代码执行此操作

第4步 等待所有客户端套接字关闭,这是我想知道如何做的。如何获取所有客户端套接字列表,服务器的子级,然后等待所有客户端套接字关闭?

Netty版 4.1.1.Final

我使用以下代码段设置Netty服务器套接字

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 ();
}

1 个答案:

答案 0 :(得分:1)

netty 4.x user guide开始,只需等待shutdownGracefully返回将等待所有套接字关闭。

  

关闭Netty应用程序通常就像关闭一样简单   关闭通过shutdownGracefully()创建的所有EventLoopGroup。它   返回一个Future,它在EventLoopGroup发生时通知您   完全终止,所有属于该组的频道都有   已关闭。