У меня была проблема, когда netty глотал исключение при использовании асинхронного способа, даже завершая будущее с помощью «Send complete!». Но мои журналы Wireshark никогда не показывали больше, чем поток SYN-> SYN, ACK-> ACK.
Мой код был следующим:
ChannelFuture channelFuture = channel.writeAndFlush(new byte[10]);
channelFuture.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
logger.info("Send completed!");
}
});
После того, как я изменил свой код для синхронизации, как Итак:
channel.writeAndFlush(new byte[10]).sync();
Я наконец обнаружил, что на самом деле произошла ошибка:
[11:58:50] [WARN] Исключение было сгенерировано xx.xxxx.xxxxx .ProxyClient.operationComplete () java .lang.UnsupportedOperationException: неподдерживаемый тип сообщения: [B (ожидается: ByteBuf, FileRegion)
Оказывается, мне нужно writeAndFlush(Unpooled.wrappedBuffer(new byte[10]))
обернуть мой массив.
Итак, я узнал, что асинхронный способ с радостью скажет вам, что он был успешным!
Но подождите, я потом обнаружил, что он, вероятно, не проглотил никаких исключений, просто я не проверял его !
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if(!future.isSuccess()){
logger.info(future.cause());
}
}
Так что если вы поменяете своего будущего слушателя на проверку isSuccess()
и распечатаете причину, это покажет вам ту же ошибку.
Я надеюсь, что если вы осмотрите свое будущее , может быть, вы тоже можете выяснить причину.