使用Netty 的 ChannelOption 和屬性

2018-08-03 16:38 更新

如果每次創(chuàng)建通道后都不得不手動(dòng)配置每個(gè)通道,這樣會(huì)很麻煩,所幸,Netty提供了 ChannelOption 來(lái)幫助引導(dǎo)配置。這些選項(xiàng)都會(huì)自動(dòng)的應(yīng)用到引導(dǎo)創(chuàng)建的所有通道中去,可用的各種選項(xiàng)可以配置底層連接的詳細(xì)信息,如通道“keep-alive(保持活躍)”或“timeout(超時(shí))”的特性。

Netty 應(yīng)用程序通常會(huì)與組織或公司其他的軟件進(jìn)行集成,在某些情況下,Netty 的組件如 Channel 會(huì)在 Netty 正常生命周期外使用;Netty 的提供了抽象 AttributeMap 集合,這是由 Netty的管道和引導(dǎo)類(lèi),和AttributeKey,常見(jiàn)類(lèi)用于插入和檢索屬性值。屬性允許您安全的關(guān)聯(lián)任何數(shù)據(jù)項(xiàng)與客戶(hù)端和服務(wù)器的Channel。

例如,考慮一個(gè)服務(wù)器應(yīng)用程序跟蹤用戶(hù)和Channel之間的關(guān)系。這可以通過(guò)存儲(chǔ)用戶(hù)ID作為Channel的一個(gè)屬性。類(lèi)似的技術(shù)可以用來(lái)路由消息到基于用戶(hù)ID或關(guān)閉基于用戶(hù)活動(dòng)的一個(gè)管道。

清單9.7展示了如何使用 ChannelOption 配置 Channel 和一個(gè)屬性來(lái)存儲(chǔ)一個(gè)整數(shù)值。

Listing 9.7 Using Attributes

final AttributeKey<Integer> id = new AttributeKey<Integer>("ID"); //1

Bootstrap bootstrap = new Bootstrap(); //2
bootstrap.group(new NioEventLoopGroup()) //3
        .channel(NioSocketChannel.class) //4
        .handler(new SimpleChannelInboundHandler<ByteBuf>() { //5
            @Override
            public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
               Integer idValue = ctx.channel().attr(id).get();  //6
                // do something  with the idValue
            }

            @Override
            protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
                System.out.println("Reveived data");
            }
        });
bootstrap.option(ChannelOption.SO_KEEPALIVE, true).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);   //7
bootstrap.attr(id, 123456); //8

ChannelFuture future = bootstrap.connect(new InetSocketAddress("www.manning.com", 80));   //9
future.syncUninterruptibly();
  1. 新建一個(gè) AttributeKey 用來(lái)存儲(chǔ)屬性值
  2. 新建 Bootstrap 用來(lái)創(chuàng)建客戶(hù)端管道并連接他們
  3. 指定 EventLoopGroups 從和接收到的管道來(lái)注冊(cè)并獲取 EventLoop
  4. 指定 Channel 類(lèi)
  5. 設(shè)置處理器來(lái)處理管道的 I/O 和數(shù)據(jù)
  6. 檢索 AttributeKey 的屬性及其值
  7. 設(shè)置 ChannelOption 將會(huì)設(shè)置在管道在連接或者綁定
  8. 存儲(chǔ) id 屬性
  9. 通過(guò)配置的 Bootstrap 來(lái)連接到遠(yuǎn)程主機(jī)


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)