[JAVA] Comment basculer dynamiquement entre FIN et RST dans Netty

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.

Spécification du comportement par défaut lors de la fermeture

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.

Sélectionnez FIN / RST lors de la fermeture

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

Comment basculer dynamiquement entre FIN et RST dans Netty
Comment changer dynamiquement les JDK lors de la construction de Java avec Gradle
Comment basculer entre plusieurs versions de Java
Ruby Comment convertir entre les majuscules et les minuscules
Basculer entre JDK 7 et JDK 8
Comment basculer Tomcat context.xml avec Eclipse WTP
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment gérer les fichiers TSV et les fichiers CSV dans Ruby
Comment lancer Swagger UI et Swagger Editor dans Docker
Comment spécifier le code de caractère et le code de saut de ligne avec JAXB
Comment éviter les conflits entre les modules JBoss et les bibliothèques d'applications
Branchement conditionnel Java: comment créer et étudier des instructions de commutation
Différence entre Java et JavaScript (comment trouver la moyenne)
[Forge] Comment enregistrer votre propre Entité et Entité Render dans 1.13.2
Politique de mise en œuvre pour enregistrer et afficher dynamiquement le fuseau horaire dans les rails
Comment définir le code de caractère et le code de saut de ligne dans Eclipse
[Rails] Différentes différences entre redirect_to et méthode de rendu et méthode de sortie de la méthode de rendu
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Comment appeler et utiliser l'API en Java (Spring Boot)
Comment développer et enregistrer une application Sota en Java
Comment changer Java à l'ère d'OpenJDK sur Mac
Comment installer les pilotes PHP 7.4 et SQL Server dans CentOS 7.7
Comment inclure PKCE Code_Verifier et Code_Challenge dans la requête JMeter
Comment POST JSON dans la méthode Java en utilisant OkHttp3 et la méthode en utilisant HttpUrlConnection-
[Webpacker] Résumé de l'installation de Bootstrap et jQuery dans Rails 6.0
Comment changer de version Java avec direnv dans le terminal sur Mac
Comment définir et utiliser un profil avec une configuration basée sur des annotations dans le framework Spring
[jOOQ] Comment utiliser CASE WHEN dans la clause WHERE / AND / OR
Comment supprimer de grandes quantités de données dans Rails et problèmes
Comment installer le langage utilisé dans Ubuntu et comment créer l'environnement
Comment synchroniser les données client entre Salesforce et Kintone (Java-Simple JDBC)
Comment obtenir et ajouter des données depuis Firebase Firestore dans Ruby
Comment utiliser Lombok au printemps
Comment utiliser StringBurrer et Arrays.toString.
Basculer dynamiquement la base de données à laquelle se connecter
Comment exécuter JUnit dans Eclipse
Comment utiliser EventBus3 et ThreadMode
Comment itérer indéfiniment en Ruby
Comment exécuter Ant dans Gradle
Comment maîtriser la programmation en 3 mois
Comment apprendre JAVA en 7 jours
Comment obtenir des paramètres dans Spark
Comment appeler des classes et des méthodes
Comment utiliser l'égalité et l'égalité (comment utiliser l'égalité)
Comment installer Bootstrap dans Ruby
Comment connecter Heroku et Sequel
Comment convertir LocalDate et Timestamp
Comment installer jQuery dans Rails 6
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Comment définir Lombok dans Eclipse
Comment concaténer des chaînes avec Java
Comment installer Swiper in Rails
Comment appeler des bibliothèques telles que JQuery et JQuery UI dans Liferay 7 / DXP
Comment modifier le nombre maximum et maximum de données POST dans Spark
Comment créer votre propre annotation en Java et obtenir la valeur
[swift5] Comment spécifier la couleur en hexadécimal
Comment implémenter la fonctionnalité de recherche dans Rails