【问题标题】:Avoid StacklessClosedChannelException避免 StacklessClosedChannelException
【发布时间】:2022-10-09 09:13:16
【问题描述】:

我一直在寻找一种避免 StacklessClosedChannelException 的方法,但我什么也没找到。我想这不安全,也不应该发生,如何避免呢?

【问题讨论】:

  • 请显示完整的堆栈跟踪
  • io.netty.channel.DefaultChannelPipeline - 触发了一个 exceptionCaught() 事件,它到达了管道的尾部。这通常意味着管道中的最后一个处理程序没有处理异常。 io.netty.channel.StacklessClosedChannelException at io.netty.channel.AbstractChannel$AbstractUnsafe.write(Object, ChannelPromise)(Unknown Source)
  • 这意味着通道已关闭,而仍在进行写入。这可能是因为远程对等方关闭了通道或者您关闭了通道。
  • 这是可以理解的,但是如何避免这个异常呢?
  • 如果它由远程对等方触发,您基本上不能。如果它是由您自己触发的,您需要确保在实际关闭通道之前发生所有写入。

标签: exception netty


【解决方案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 布尔值,但我没有充分测试它。

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多