Lors de la construction d'un serveur à l'aide de Netty, vous souhaiterez peut-être utiliser FIN et RST correctement en fonction de la situation lors de la fermeture de Channel (socket). Par exemple, il est nécessaire que FIN (RST en cas de temporisation différée) soit normal, mais RST est immédiatement détecté lorsqu'une anomalie est détectée.
L'utilisation de FIN / RST lorsque Channel
est fermé peut être spécifiée lors de la construction de ServerBootstrap
.
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(0);
ServerBootstrap bootstrap = new ServerBootstrap()
.option(ChannelOption.SO_BACKLOG, 1024)
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childOption(ChannelOption.SO_LINGER, 10) //FIN → Délai d'expiration(10 secondes)→ Spécifiez pour fermer avec RST
.childHandler(new MyChannelInitializer());
// ...
NOTE:
La libération par RST qui spécifie> -1 est désactivée.
Si vous voulez fermer le ServerBootstrap
d'une manière différente du comportement par défaut spécifié lors de sa construction, vous pouvez le faire en obtenant le ChannelConfig
du Channel
et en modifiant le paramètre SO_LINGER.
@ChannelHandler.Sharable
class MyHandler extends SimpleChannelInboundHandler<byte[]> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, byte[] msg) {
// ...
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
ctx.channel().config().setOption(ChannelOption.SO_LINGER, 0); //Spécifiez pour fermer avec RST immédiatement
ctx.close();
}
}
Recommended Posts