【问题标题】:Is Netty Channel.close() thread safe?Netty Channel.close() 线程安全吗?
【发布时间】:2016-08-18 15:27:57
【问题描述】:

我有一个 Netty 服务器,我需要在另一个线程中关闭请求通道。这样做线程安全吗?如果没有,是否有一些解决方法可以解决它?任何建议表示赞赏!

顺便说一句,我正在使用带有 NioEventLoopGroup 的 netty-4.0.34。

AbstractChannelHandlerContext.java:514

    @Override
    public ChannelFuture close(final ChannelPromise promise) {
    if (!validatePromise(promise, false)) {
        // cancelled
        return promise;
    }

    final AbstractChannelHandlerContext next = findContextOutbound();
    EventExecutor executor = next.executor();
    if (next.isHandlerAddedCalled() && executor.inEventLoop()) {
        next.invokeClose(promise);
    } else {
        safeExecute(executor, new OneTimeTask() {
            @Override
            public void run() {
                next.invokeClose(promise);
            }
        }, promise, null);
    }

    return promise;
}

如果在另一个线程中调用,该通道所坚持的 IO 线程最终将执行关闭,因为 'executor.inEventLoop()' 将始终为 false。这种解释是真的吗?

【问题讨论】:

    标签: thread-safety netty


    【解决方案1】:

    它是线程安全的,但如果请求正在进行,您可能会在管道和客户端触发异常。

    【讨论】:

    • 在我的场景中,我使用 'org.quartz-scheduler' 启动了一个计时器线程,并在超时时关闭通道。由于计时器线程不是EventLoop中的IO线程,所以我想知道哪个线程最终会完成关闭过程?
    • 你可以考虑使用一个空闲的 Handler 来关闭。
    猜你喜欢
    • 2023-03-05
    • 2016-08-10
    • 2013-04-28
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2020-04-15
    • 2011-07-04
    • 2014-04-26
    相关资源
    最近更新 更多