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.