В этом фрагменте кода shutdownGracefully(). SyncUninterruptibly() никогда не возвращается. Является ли это ожидаемым поведением или я что-то не понял? Испытано с Нетти 4.0.35.FinalShutdownGracefully() никогда не возвращает
public class ShutdownGracefullyDemo {
private ServerBootstrap bootstrap;
public static void main(String[] args) throws Exception {
new ShutdownGracefullyDemo().initialize();
}
private void initialize() throws InterruptedException {
NioEventLoopGroup group = new NioEventLoopGroup();
bootstrap = new ServerBootstrap();
bootstrap.group(group)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new MyInboundHandler())
.bind(2025)
.sync()
.channel()
.closeFuture()
.sync();
}
@ChannelHandler.Sharable
private class MyInboundHandler extends SimpleChannelInboundHandler<ByteBuf> {
Charset charset = Charset.forName("US-ASCII");
@Override
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg)
throws Exception {
String data = msg.toString(charset);
System.out.println("Received: " + data);
if ("quit\r\n".equals(data)) {
shutdown();
}
}
}
private void shutdown() {
if (bootstrap != null && bootstrap.group() != null) {
bootstrap.group().shutdownGracefully().syncUninterruptibly();
System.out.println("shutdown completed");
}
}
}
Спасибо Derek за ваш ответ! В моем отрывке я вдохнул вдохновение из книги Нормана Маурера «Нетти в действии», где в примере завершения метод 'future.syncUninterruptibly()' вызывается после 'shutdownGracefully()' и фактически ложная логика вызова выключения и уведомления, когда завершение работы имеет смысл для меня. Но по какой-то причине это сбивает меня с толку, это не работает так, как ожидалось, поскольку никто не уведомляет ожидающую нить. – staedler
Может быть сервер, ожидающий закрытия всего клиентского канала, и выполнение задачи на этом канале, например, мертвая блокировка, чтобы вы могли создать новый поток для выключения (или другого лучшего способа). –