日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

Netty的SO_LINGER不要隨便用

作者:不識君的荒漠 更新時間: 2023-07-04 編程語言

SO_LINGER

SO_LINGER是一個Socket選項,它決定一個Socket關閉時的行為,因此配在server端配置的時候使用childOption配置,該選項針對每個連接配置生效,而不是全局性的配置。

該配置主要在阻塞IO的關閉場景下用的更多,當然,對于非阻塞式IO這個也是同樣可以使用的,畢竟是針對socket的關閉行為,但是實際意義有限。

該參數(shù)指定了關閉時的超時時間,當SO_LINGER設置為0時,表示禁用SO_LINGER,關閉Socket后立即返回,內(nèi)核丟棄套接字發(fā)送隊列中的數(shù)據(jù),并發(fā)送TCP RST。這種行為經(jīng)常被稱為“硬關閉”。

當SO_LINGER設置為非零正整數(shù)時,當Socket關閉時將等待所有數(shù)據(jù)都已發(fā)送或超時到達所指定的超時值。如果要發(fā)送的數(shù)據(jù)與指定的超時時間相比較,那么將立即返回。

在Netty中,SO_LINGER選項默認設置為-1,它采用操作系統(tǒng)默認行為。在大多數(shù)情況下,使用操作系統(tǒng)默認行為即可,但在某些特殊情況下可能需要調(diào)整此選項,例如在需要確保所有數(shù)據(jù)已經(jīng)發(fā)送的應用程序中。

配置示例

        bootstrap = new ServerBootstrap().group(bossGroup, workerGroup)
                .channel(NettyUtils.nioOrEpollServerSocketChannel())
                .childOption(ChannelOption.SO_LINGER, -1)
                .childOption(NioChannelOption.SO_LINGER, -1)

如示例代碼,有兩種配置方式,使用ChannelOption.SO_LINGER或者NioChannelOption.SO_LINGER。
這兩種方式的主要區(qū)別在代碼:io.netty.channel.socket.nio.NioServerSocketChannel的內(nèi)部類:NioServerSocketChannelConfig有setOption方法:

        @Override
        public <T> boolean setOption(ChannelOption<T> option, T value) {
            if (PlatformDependent.javaVersion() >= 7 && option instanceof NioChannelOption) {
                return NioChannelOption.setOption(jdkChannel(), (NioChannelOption<T>) option, value);
            }
            return super.setOption(option, value);
        }

如果java版本大于等于7并且是NioChannelOption最終會調(diào)用jdk的設置方式。
實際上這個地方區(qū)別對于這個參數(shù)的配置結果都是一樣的,沒有區(qū)別,可以隨便選擇一種方式。

不建議使用

在非阻塞IO下,SO_LINGER選項的作用有限。因為在非阻塞IO中,寫操作通常是異步的,即數(shù)據(jù)被發(fā)送到緩沖區(qū)后就會立即返回,不會等待數(shù)據(jù)被傳輸?shù)侥繕藱C器。因此,關閉套接字時如果設置了SO_LINGER選項,也不會等待所有未發(fā)送的數(shù)據(jù)發(fā)送完畢,因為已經(jīng)無法確保所有數(shù)據(jù)都被發(fā)送出去了。

在Netty中,如果設置了SO_LINGER選項,在使用非阻塞IO時可能會導致套接字無法正確關閉,從而導致資源泄露。因此,在Netty中,我們通常不會使用SO_LINGER選項,而是使用Netty提供的優(yōu)雅關閉機制,即調(diào)用Channel.close()方法并在關閉前等待所有數(shù)據(jù)發(fā)送完畢。

需要注意的是,在某些特殊情況下,SO_LINGER選項仍然有用。比如在使用TCP連接池等技術時,可能會出現(xiàn)連接池中的連接狀態(tài)不同步的問題,此時可能需要使用SO_LINGER選項來確保所有數(shù)據(jù)被發(fā)送完畢,從而避免數(shù)據(jù)丟失或者連接不同步的問題。

注意事項

  1. SO_LINGER選項只對關閉套接字時的行為有影響,對于讀寫操作沒有任何影響。
  2. SO_LINGER選項默認是禁用的,如果要啟用需要手動設置。
  3. SO_LINGER選項的值為-1時,表示關閉套接字時將等待所有未發(fā)送的數(shù)據(jù)發(fā)送完畢,直到超時或數(shù)據(jù)全部發(fā)送完畢。
  4. SO_LINGER選項的值為0時,表示關閉套接字時將立刻關閉套接字,已發(fā)送但未被確認的數(shù)據(jù)將被丟棄。
  5. SO_LINGER選項的值大于0時,表示關閉套接字時將等待指定的時間,以確保數(shù)據(jù)被發(fā)送完畢。
  6. 在使用SO_LINGER選項時需要注意超時時間的設置,避免出現(xiàn)無法關閉套接字的情況,從而導致資源泄漏。

原文鏈接:https://blog.csdn.net/x763795151/article/details/130114960

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新