【问题标题】:Closing a channel in Netty and waiting for its handlers to be removed关闭 Netty 中的通道并等待其处理程序被删除
【发布时间】:2019-06-26 03:39:43
【问题描述】:

我有一个关于在 Netty 4.1.32 中使用 NioSocketChannelchannel.close()channel.deregister() 的问题。

我注意到channel.close() 返回的未来在底层套接字关闭后完成,然后管道被取消注册并从中删除处理程序。

我有一个用例,我必须等待处理程序全部被删除。我注意到我可以通过在来自channel.close() 的未来完成后显式调用channel.deregister() 并等待deregister() 返回的未来完成来实现它。然而,这导致了另一个问题:channel.deregister() 不会在管道中触发channelInactive(),它也会阻止前面的channel.close() 调用channelInactive()

这是故意的吗?如果是,你能推荐一些东西来关闭通道并安全地等待它的管道被完全拆除,保持生命周期事件的正常流动吗? (我确实有一些想法,比如在管道前面放置一个处理程序并等待它的handlerRemoved(),或者以某种方式利用管道的HeadContext,但我不太喜欢它们中的任何一个。)

【问题讨论】:

    标签: netty


    【解决方案1】:

    我认为你建议的方法基本上是唯一的方法(添加一个处理程序,然后等待 handlerRemoved(...)。

    【讨论】:

    • 你愿意我向 Netty 提交 PR 以改变行为吗? (要么仅在删除所有处理程序后才完成关闭的未来,要么在适当的情况下从注销中触发 channelInactive?)
    • 我认为一旦所有处理程序都被删除,我们可能可以通知“closeFuture()”,但我需要查看 PR 并与其他人交谈。
    • 好的,那我试试看。
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 2016-03-24
    • 2012-01-09
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多