避免 StacklessClosedChannelException

Avoid StacklessClosedChannelException

提问人:andreasdc 提问时间:12/10/2021 更新时间:11/18/2023 访问量:8168

问:

我一直在寻找一种避免 StacklessClosedChannelException 的方法,但我没有找到任何东西。我想这是不安全的,不应该发生,如何避免它?

异常 netty

评论

0赞 Norman Maurer 12/10/2021
请显示完整的堆栈跟踪
0赞 andreasdc 12/11/2021
io.netty.channel.DefaultChannelPipeline - 触发了 exceptionCaught() 事件,该事件到达了管道的尾部。这通常意味着管道中的最后一个处理程序未处理异常。io.netty.channel.StacklessClosedChannelException at io.netty.channel.AbstractChannel$AbstractUnsafe.write(Object, ChannelPromise)(来源不明)
0赞 Norman Maurer 12/13/2021
这意味着通道已关闭,而仍在进行写入。这可能是因为远程对等方关闭了通道,或者你关闭了通道。
0赞 andreasdc 12/14/2021
这是可以理解的,但如何避免这种例外呢?
0赞 Norman Maurer 12/15/2021
如果它是由远程对等体触发的,你基本上不能。如果它是由你自己触发的,你需要确保在你实际关闭通道之前发生所有写入。

答:

0赞 FearNot 10/9/2022 #1

为避免此类异常,您应该检查通道是否处于活动状态或至少处于打开状态。有一个布尔验证可以实现这一点。这是 Kotlin 版本:

    val f: ChannelFuture = bootstrap.connect(HOST, PORT).sync()
    val channel = f.channel()

    if (channel?.isActive == true) {
        val f: ChannelFuture? = channel?.writeAndFlush(msg)?.sync()
    else {
        //Channel not even open and therefore it's not writable
    }

还有一个布尔值,但我没有充分测试它。ìsWritable