开发者

一文详解Java Netty中的Constant类

目录
  • Constant
    • ChannelConfig
  • Netty中重要的Constant实现类:ChannelOption和AttributeKey
    • ChannelOption
    • AttributeKey
    • 源码学习
  • 小结

    Constant

    • Constant 和 ConstantPool 是用于表示常量的一种机制。
    • Constant 接口定义了常量的基本属性和方法,包括唯一标识 ID、名称

    一文详解Java Netty中的Constant类

    • value就是Constant本身,确定范型的具体类型即可。

    一文详解Java Netty中的Constant类

    class Main {
       public static void main(String[] args) {
          MyConstant value = new MyConsjavascripttant();
          System.out.println(value.PI);
          System.out.println(value.object);
      }
      static class MyConstanORcVKt implements Constant<MyConstant> {
          public double PI = 3.1415926;
          public Object object = new Object();
          private final int id;
          private final String name;
          public MyConstant() {
              id = new Random().nextInt();
              name = id + "#";
          }
          @Override
          public int id() {
              return id;
          }
          @Override
          public String name() {
              return name;
          }
          @Override
          public int compareTo(MyConstant other) {
              return Integer.compare(id, other.id);
          }
       }
    }
    • 但是一般通过ConstantPool进行管理

    一文详解Java Netty中的Constant类

    一文详解Java Netty中的Constant类

      • 注意范型T继承自Constant。
    • 常量都是类的形式

    ChannelConfig

    • ChannelConfig是一个Channel的配置属性集合。请将其向下转换为更具体的配置类型,例如SocketChannelConfig,或使用setOptions(Map)来设置与传输相关的属性:
    Channel ch = ...; 
    SocketChannelConfig cfg = (SocketChannelConfig) ch.getConfig(); 
    cfg.setTcpNoDelay(false);

    Option map是一个动态的只写属性,允许在不向下转换其关联的ChannelConfig的情况下配置一个Channel。

    • 动态的只写属性是指,属性值可以在程序运行时动态地进行修改,但只能进行写操作,不能进行读操作。在Option map中,只提供了设置属性值的方法,没有提供获取属性值的方法,因此称之为只写属性。
    • 不需要转型:
    Channel ch = ...; 
    Map<ChannelOption<?>, Object> options = new HashMap<>(); 
    options.put(ChannelOption.SO_TIMEOUT, 5000); 
    options.put(ChannelOption.SO_KEEPALIVE, true); 
    ch.config().setOptions(options);
    //不需要SocketChannelConfig cfg = (SocketChannelConfig) ch.getConfig();
    //所有Channel都可以用
    • 更新选项映射,请调用setOptions(Map)。所有的ChannelConfig都有以下选项:
    名称 关联的设置方法 
    ChannelOption.CONNECT_TIMEOUT_MILLIS setConnectTimeoutMillis(int)
    ChannelOption.W开发者_C学习RITE_SPIN_COUNT setWriteSpinCount(int) 
    ChannelOption.WRITE_BUFFER_WATER_MARK setWriteBufferWaterMark(WriteBufferWaterMark)
    ChannelOption.ALLOCATOR setAllocator(ByteBufAllocator) 
    ChannelOption.AUTO_READ setAutoRead(boolean)
    • 在ChannelConfig的子类型中还有更多选项可用。例如,您可以根据SocketChannelConfig中所述的方式配置特定于TCP/IP套接字的参数。
    • 要注意这些配置是真实存在的,不能乱配,UPD显然是没有保活机制的,就不能用options.put(ChannelOption.SO_KEEPALIVE, true);

    Netty中重要的Constant实现类:ChannelOption和AttributeKey

    ChannelOption

    • 该类就是以类型安全的方式配置ChannelConfig。
      • 使用 ChannelOption 时可以通过编译器进行类型检查,从而避免在运行时出现类型错误的情况。

    一文详解Java Netty中的Constant类

    • 用例:
    Bootstrap b = new Bootstrap(); 
    b.group(group) 
     .channel(NIOSocketChannel.class) 
     .remoteAddress(new InetSocketAddress("example.com", 80)) 
     // 使用 ChannelOption 配置连接超时时间 
     .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)

    AttributeKey

    • 注意这是Key,它是映射到Attribute的。

    一文详解Java Netty中的Constant类

    一文详解Java Netty中的Constant类

    • 在Netty中,Attribute用于在Channel中存储关联的元数据。可以将Attribute看作是一个键值对,其中键是一个AttributeKey类型的对象,而值是任意类型的Java对象。
      • Attribute在网络应用中有着广泛的用途,例如:
        • 存储和获取连接的会话信息;
        • 存储和获取连接的统计信息;
        • 存储和获取连接的用户权限信息;
        • 存储和获取连接的特定状态信息,如是否已经登录等。
    • 可以通过Channelattr()方法获取一个AttributeMap对象,用于存储和获取Attribute。其中,AttributeMap是一个接口,其默认实现为DefaultAttributeMap,可以使用它来操作Attribute
    • 用例:
    public class MyHandler {
     private final Attribute<AtomicInteger> messageCounterAttr;
    
     public MyHandler(Channel channel) {
         messageCounterAttr = channel.attr(AttributeKey.valueOf("messageCounter"));
         messageCounterAttr.set(new AtomicInteger(0));
     }
    
     public void handle(Object msg) {
         // increment message counter
         AtomicInteger messageCounter = messageCounterAttr.get();
         messageCounter.incrementAndGet();
    
         // do other things with the message
         // ...
     }
    }

    源码学习

    • ConstantPool中的valueOf方法

    一文详解Java Netty中的Constant类

      • 第一次检测是为了避免重复创建,如果该常量已经存在,则直接返回该常量;第二次检测是为了保证多线程下的线程安全,只有当该常量不存在时才创建新的常量,如果另一个线程已经创建了该常量,则直接返回已创建的常量。
      • 如果不使用双重检测,可能会出现多个线程同时创建相同名称的常量,导致产生多个相同的常量实例。因此,使用双重检测可以避免重复创建常量,并保证在多线程环境下的线程安全。

    小结

    • Constant类是 Netty 框架提供的用于实现常量池的类,通常用于框架内部的常量定义,而不是用于业务代码的常量定义。
    • AttributeKeyChannelOption 都是 Netty 中用于为 ChannelChannelConfig 存储属性的机制,php它们的主要区别在于作用的范围和使用场景。
    • ChannelOption 是一种可选配置项,它定义了 ChannelConfig 可以使用的参数。ChannelOption 可以用于配置网络协议的底层参数,例如 SO_LINGER 或 TCP_NODELAY 等。
      • 通常情况下,ChannelOption 用于设置连接参数,例如连php接超时时间、Nagle 算法等。
      • ChannelOption 是针对 ChannelConfig,使用 channel.config().setOption(option, value) 方法来设置。
      • ChannelOption 适用于需要传递给 Netty 底层的配置参数。
    • AttributeKey 则是用于在 Channel 上存储一些属性,这些属性通常是业务逻辑相关的,例如登录用户、登录状态等。AttributeKey 对象是一个标识符,可以在 Channel 上存储和访问一个属性值。
      • ChannelOption 不同,AttributeKehttp://www.devze.comy 存储的属性是不透明的,Netty 不知道这些属性的含义,因为是自定义的。
      • AttributeKey 适用于需要在业务逻辑中存储和访问数据的场景,例如在一个 ChannelHandler 中存储和读取登录用户信息。
    • Attribute用于在Channel中存储一些自定义的数据 ,这些数据可以被Channel中的各个处理器共享和访问。

    以上就是一文详解Java Netty中的Constant类的详细内容,更多关于Netty Constant类的资料请关注我们其它相关文章!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜