基本的に、次のデコーダーがあります。
public class Decoder extends ReplayingDecoder<Packet, Void> {
@Override
public Packet decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
short id = in.readUnsignedByte();
Packet packet = Packet.newInstance(id);
if (packet == null) {
throw new IOException("Wasn't prepared to deal with packet 0x" + Integer.toHexString(id));
}
packet.read(in);
return packet;
}
}
ストリームから入力を取得し、符号なしバイト パケット ID を読み取り、そのバイトを使用してデコーダを構築するように設計されていますが、ここでの問題は、無効な入力 (IOException がスローされる場所) でシステムをシャットダウンすることです。ChannelHandlerContext.close() と ChannelHandlerContext.channel().close() を使用してみましたが、どちらもループ内で Decoder を呼び出すことになり、スタックしてしまいます。
この接続を適切に閉じる方法を教えてください。
余談ですが、読み取りが x ミリ秒以上ブロックされたときに接続を終了する方法を知っておくとよいでしょう。