Netty ServerSocket и изящное завершение работы детей
Я хотел бы закрыть сокет сервера на сервере 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 ();
}
1 ответ
Из руководства пользователя netty 4.x видно, что ожидание shutdownGracefully
возврат будет ждать, пока все сокеты не будут закрыты.
Завершение работы приложения Netty обычно так же просто, как завершение всех групп EventLoopGroup, которые вы создали с помощью shutdownGracefully(). Он возвращает Future, который уведомляет вас, когда EventLoopGroup был полностью завершен, и все каналы, принадлежащие группе, были закрыты.