Exceptions dans Netty

Exceptions à Netty

1. Vue d'ensemble

Dans cet article rapide, nous examinerons la gestion des exceptions dans Netty.

En termes simples, Netty est un cadre permettant de créer des applications réseau asynchrones et pilotées par les événements hautes performances. I/O operations are handled inside its life-cycle using callback methods.

Plus de détails sur le framework et comment démarrer avec lui peuvent être trouvés dans nos précédentsarticle here.

2. Gestion des exceptions dans Netty

Comme mentionné précédemment,Netty is an event-driven system and has callback methods for specific events. Exceptions are such events too.

Des exceptions peuvent se produire lors du traitement des données reçues du client ou lors des opérations d'E / S. Lorsque cela se produit, un événement capturé par une exception est déclenché.

2.1. Traitement des exceptions dans le canal d'origine

The exception-caught event, when fired, is handled by the exceptionsCaught() method duChannelInboundHandler ou de ses adaptateurs et sous-classes.

Notez que le rappel est obsolète dans l'interfaceChannelHandler. Il est désormais limité à l’interfaceChannelInboudHandler.

La méthode accepte un objetThrowable et un objetChannelHandlerContext comme paramètres. L'objetThrowable peut être utilisé pour imprimer la trace de la pile ou obtenir le message d'erreur localisé.

Créons donc un gestionnaire de canal,ChannelHandlerA et remplaçons sesexceptionCaught() avec notre implémentation:

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
  throws Exception {

    logger.info(cause.getLocalizedMessage());
    //do more exception handling
    ctx.close();
}

Dans l'extrait de code ci-dessus, nous avons consigné le message d'exception et avons également appelé lesclose() desChannelHandlerContext.

Cela fermera le canal entre le serveur et le client. Ce qui provoque essentiellement la déconnexion et la terminaison du client.

2.2. Propagation des exceptions

Dans la section précédente, nous avons traité l'exception dans son canal d'origine. Cependant, nous pouvons réellement propager l'exception sur un autre gestionnaire de canal dans le pipeline.

Au lieu de consigner le message d'erreur et d'appelerctx.close(), nous utiliserons l'objetChannelHandlerContext pour déclencher manuellement un autre événement intercepté par exception.

Cela entraînera l'appel desexceptionCaught() du prochain gestionnaire de canal dans le pipeline.

Modifions l'extrait de code dansChannelHandlerA pour propager l'événement en appelant lesctx.fireExceptionCaught():

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
  throws Exception {

    logger.info("Exception Occurred in ChannelHandler A");
    ctx.fireExceptionCaught(cause);
}

De plus, créons un autre gestionnaire de canal,ChannelHandlerB et remplaçons sesexceptionCaught() avec cette implémentation:

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
  throws Exception {

    logger.info("Exception Handled in ChannelHandler B");
    logger.info(cause.getLocalizedMessage());
    //do more exception handling
    ctx.close();
}

Dans la classeServer, les canaux sont ajoutés au pipeline dans l'ordre suivant:

ch.pipeline().addLast(new ChannelHandlerA(), new ChannelHandlerB());

La propagation manuelle des événements interceptés par une exception est utile dans les cas où toutes les exceptions sont gérées par un gestionnaire de canal désigné.

3. Conclusion

Dans ce didacticiel, nous avons examiné comment gérer les exceptions dans Netty à l'aide de la méthode de rappel et comment propager les exceptions si nécessaire.

Le code source complet est disponibleover on Github.