我想在Netty服务器上关闭服务器套接字,然后在执行资源清理之前等待所有子进程完成处理。
第1步
等待使用此代码在主线程上关闭Netty服务器套接字,其中b
是ServerBootstrap
的实例
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 ();
}
答案 0 :(得分:1)
从netty 4.x user guide开始,只需等待shutdownGracefully
返回将等待所有套接字关闭。
关闭Netty应用程序通常就像关闭一样简单 关闭通过shutdownGracefully()创建的所有EventLoopGroup。它 返回一个Future,它在EventLoopGroup发生时通知您 完全终止,所有属于该组的频道都有 已关闭。