Exceções no Netty

Exceções no Netty

1. Visão geral

Neste artigo rápido, veremos o tratamento de exceções no Netty.

Simplificando, o Netty é uma estrutura para a criação de aplicativos de rede assíncronos e orientados a eventos de alto desempenho. I/O operations are handled inside its life-cycle using callback methods.

Mais detalhes sobre o framework e como começar a usá-lo podem ser encontrados em nossoarticle here anterior.

2. Lidando com exceções no Netty

Como mencionado anteriormente,Netty is an event-driven system and has callback methods for specific events. Exceptions are such events too.

Exceções podem ocorrer durante o processamento de dados recebidos do cliente ou durante operações de E / S. Quando isso acontece, um evento capturado por exceção dedicado é acionado.

2.1. Lidando com exceções no canal de origem

The exception-caught event, when fired, is handled by the exceptionsCaught() method deChannelInboundHandler ou seus adaptadores e subclasses.

Observe que o retorno de chamada foi descontinuado na interfaceChannelHandler. Agora está limitado à interfaceChannelInboudHandler.

O método aceita um objetoThrowable e um objetoChannelHandlerContext como parâmetros. O objetoThrowable pode ser usado para imprimir o rastreamento da pilha ou obter a mensagem de erro localizada.

Então, vamos criar um manipulador de canal,ChannelHandlerAe substituir seuexceptionCaught() com nossa implementação:

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

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

No trecho de código acima, registramos a mensagem de exceção e também chamamosclose() deChannelHandlerContext.

Isso fechará o canal entre o servidor e o cliente. Essencialmente, fazendo com que o cliente desconecte e encerre.

2.2. Propagando exceções

Na seção anterior, tratamos a exceção em seu canal de origem. No entanto, podemos propagar a exceção para outro manipulador de canal no pipeline.

Em vez de registrar a mensagem de erro e chamarctx.close(), usaremos o objetoChannelHandlerContext para disparar outro evento detectado por exceção manualmente.

Isso fará com que oexceptionCaught() do próximo manipulador de canal no pipeline seja chamado.

Vamos modificar o snippet de código emChannelHandlerA para propagar o evento chamandoctx.fireExceptionCaught():

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

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

Além disso, vamos criar outro manipulador de canal,ChannelHandlerBe substituir seuexceptionCaught() com esta implementação:

@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();
}

Na classeServer, os canais são adicionados ao pipeline na seguinte ordem:

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

A propagação manual de eventos capturados por exceção é útil nos casos em que todas as exceções estão sendo tratadas por um manipulador de canal designado.

3. Conclusão

Neste tutorial, vimos como lidar com exceções no Netty usando o método de retorno de chamada e como propagar as exceções, se necessário.

O código-fonte completo está disponívelover on Github.