返回顶部
首页 > 资讯 > 后端开发 > Python >一文详解JavaNetty中的Constant类
  • 749
分享到

一文详解JavaNetty中的Constant类

JavaNetty中的Constant类NettyConstant类JavaConstant 2023-05-19 08:05:37 749人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录ConstantChannelConfigNetty中重要的Constant实现类:ChannelOption和AttributeKeyChannelOptionAttribut

Constant

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

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

class Main {
   public static void main(String[] args) {
      MyConstant value = new MyConstant();
      System.out.println(value.PI);
      System.out.println(value.object);
  }
  static class MyConstant 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进行管理

    • 注意范型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.WRITE_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 时可以通过编译器进行类型检查,从而避免在运行时出现类型错误的情况。

  • 用例:
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的。

  • 在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方法

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

小结

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

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

--结束END--

本文标题: 一文详解JavaNetty中的Constant类

本文链接: https://lsjlt.com/news/212778.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文详解JavaNetty中的Constant类
    目录ConstantChannelConfigNetty中重要的Constant实现类:ChannelOption和AttributeKeyChannelOptionAttribut...
    99+
    2023-05-19
    Java Netty中的Constant类 Netty Constant类 Java Constant
  • 一文详解C++中的类型转化
    目录1. C语言中的类型转换2. C++强制类型转换1. static_cast2.reinterpret_cast3.const_cast4.dynamic_cast总结1. C语...
    99+
    2023-05-18
    C++实现类型转化 C++类型转化
  • 一文详解Java中的类加载机制
    目录一、前言二、类加载的时机2.1 类加载过程2.2 什么时候类初始化2.3 被动引用不会初始化三、类加载的过程3.1 加载3.2 验证3.3 准备3.4 解析3.5 初始化四、父类...
    99+
    2024-04-02
  • 一文详解Object类和抽象类
    目录一、抽象类是什么?二、初始抽象类2.1 基本语法2.2 继承抽象类三、抽象类总结四、Object类4.1 初始Object4.2 toString4.3 equals4.4 ha...
    99+
    2024-04-02
  • 一文详解Golang中的切片数据类型
    目录含义定义三个要素切片与数组的区别示例代码切片内存分布切片定义分类数组生成切片示例代码切片索引直接声明切片定义语法代码示例使用make定义切片常用操作长度计算容量计算判断是否为空切...
    99+
    2024-04-02
  • 一文详解JavaScript中的Mixin
    目录什么是 Mixin显示混入隐式混入总结类的出现最终使 JavaScript 非常容易使用继承语法,JavaScript 类比大多数人意识到的更强大,它是构建真正的 mixins ...
    99+
    2023-05-18
    JavaScript 中的 Mixin JavaScript Mixin介绍 JavaScript Mixin
  • 一文详解 Java 的八大基本类型!
    自从Java发布以来,基本数据类型就是Java语言中重要的一部分,本文就来详细介绍下每种基本类型的具体使用方法和限制。以下为译文:几年前,我开始编写了一系列有关Java入门的文章,我觉得有必要将其中一些非常细节的内容单独拿出来写成文章。这样...
    99+
    2023-06-02
  • 一文详解Golang中的反射
    本篇文章带大家主要来聊聊Golang中反射,希望对你有新的认知。虽然很多人使用 Go 语言有一定时间了,甚至有的使用了 1 年 2 年,然后对于 Go 语言中的反射还是模棱两可,使用起来的时候,心里也不是非常有底气。【相关推荐:Go视频教程...
    99+
    2023-05-14
    反射 go语言 Golang
  • 一文详解golang中的注释
    Golang是一种编程语言,它有着比较高的代码可读性和简洁性。然而,在编写代码时,总有些地方需要添加注释来帮助解释某些细节或者增加代码的可读性。在这篇文章中,我们将介绍一些关于Golang注释的内容。一、单行注释单行注释是在代码行的末尾添加...
    99+
    2023-05-14
    go语言 Golang 注释
  • 一文详解Golang中的方法
    Golang(也被称为Go)是一种并发编程语言,它是由谷歌公司开发的。Golang很流行,因为它的代码简洁、易读并且能够处理高并发。一个Golang程序在编写时包含有函数和方法,本文将会关注Golang的方法。方法是面向对象编程中的关键部分...
    99+
    2023-05-14
    Golang go语言
  • 一文详解JavaScript中的闭包
    JavaScript 闭包是一种重要的概念,在 JavaScript 编程中被广泛使用。尽管它可能会让初学者感到困惑,但它是理解 JavaScript 语言核心的关键概念之一。本文将深入探讨 JavaScript 闭包,让你了解它是如何工作...
    99+
    2023-05-14
    闭包 前端 JavaScript
  • 一文简单了解C# 中的DataSet类
    目录前言DataSet属性和方法界面设计效果展示代码逻辑前言 今天我们一起学习一下DataSet类,DataSet类官方的表示是这样的:"表示数据的内存中缓存",...
    99+
    2024-04-02
  • 一文详解Golang中的位操作
    本篇文章带大家深入了解下Golang中的位操作,介绍一下详述每个操作符以及它们如何使用的案例,希望对大家有所帮助!php零基础到就业直播视频课:进入学习全程直播 + 实战授课 + 边学 + 边练 + 边辅导【推荐】《接口如何自动化测试?单流...
    99+
    2024-04-02
  • 一文详解Redis中的持久化
    目录1. 前言2. RDB2.1 手动触发2.2 自动触发3. bgsave大致流程4. RDB持久化方式的优缺点5. AOF6. AOF的使用方式7. AOF流程剖析7.1 命令写入7.2 文件同步7.3 重写机制7....
    99+
    2024-04-02
  • 一文详解Python中的super 函数
    目录实战场景实战编码单继承使用实战场景 经常有朋友问,学 Python 面向对象时,翻阅别人代码,会发现一个 super() 函数,那这个函数的作用到底是什么? super() 函数...
    99+
    2024-04-02
  • 一文详解JavaScript中prototype的使用
    目录prototype初步认识函数有prototype属性,函数创建的对象没有获得当前对象的属性父和子的扩展子的proto和prototype的区别扩展得到的东西到底从哪来的prot...
    99+
    2024-04-02
  • 一文详解Oracle中RAC的用法
    目录1. oracle RAC介绍1.1 基本概念1.2 Oracle RAC应用场景1.3 Oracle RAC的优缺点2. Oracle RAC架构3. Oracle RAC 的安装1. Oracle RAC介绍 1...
    99+
    2023-06-16
    Oracle RAC用法 Oracle RAC
  • 一文详解CSS3中的Flex布局
    简介什么是Flex布局Flex是Flexible Box 的缩写,也称为弹性盒子布局。 Flex布局组成:flex容器(flex container)flex项(flex items)主轴(main axis)交叉轴(cross axis)...
    99+
    2022-11-22
    css CSS3 flex
  • 一文详解es6中的模块化
    Es Module 的解析流程在开始之前,我们先大概了解一下整个流程大概是怎么样的,先有一个大概的了解:阶段一:构建(Construction),根据地址查找 js 文件,通过网络下载,并且解析模块文件为 Module Record;阶段二...
    99+
    2022-11-22
    ES6 前端 JavaScript 面试
  • 一文详解JAVA中InputStreamReader流
    目录一、InputStreamReader类二、InputStreamReader构造方法三、InputStreamReaderAPI四、InputStreamReader类与Fil...
    99+
    2023-05-17
    JAVA InputStreamReader流 JAVA InputStreamReader
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作