java—如何正确关闭网络通道而不终止工作组

csga3l58  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(382)

我有以下绑定来处理udp数据包

private void doStartServer() {
        final UDPPacketHandler udpPacketHandler = new UDPPacketHandler(messageDecodeHandler);
        workerGroup = new NioEventLoopGroup(threadPoolSize);

        try {
            final Bootstrap bootstrap = new Bootstrap();
            bootstrap
                .group(workerGroup)
                .handler(new LoggingHandler(nettyLevel))
                .channel(NioDatagramChannel.class)
                .option(ChannelOption.SO_BROADCAST, true)
                .handler(udpPacketHandler);

            bootstrap
                .bind(serverIp, serverPort)
                .sync()
                .channel()
                .closeFuture()
                .await();
        } finally {
            stop();
        }
    }

和处理程序

@ChannelHandler.Sharable    << note this
@Slf4j
@AllArgsConstructor
public class UDPPacketHandler extends SimpleChannelInboundHandler<DatagramPacket> {

    private final MessageP54Handler messageP54Handler;

    @Override
    public void channelReadComplete(final ChannelHandlerContext ctx) {
        ctx.flush();
    }

    @Override
    public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) {
        log.error("Exception in UDP handler", cause);
        ctx.close();
    }
}

在某个时刻我得到了这个例外 java.net.SocketException: Network dropped connection on reset: no further information 这是在 exceptionCaught . 这会触发 ChannelHandlerContext 关闭。在这一点上,我的整个服务器停止(在 finnaly (第一个代码段中的块)
如何正确地处理异常,以便我可以处理新的连接,即使在这种异常发生后?

wnavrhmk

wnavrhmk1#

你不应该关门 ChannelHandlerContextIOException 当使用 DatagramChannel . 作为 DatagramChannel 是“无连接”异常是特定于一个“接收”或一个“发送”操作的。所以只要记录它(或者你想做的任何事情)然后继续。

相关问题