Python 官方文档:入门教程 => 点击学习
目录ConstantChannelConfigNetty中重要的Constant实现类:ChannelOption和AttributeKeyChannelOptionAttribut
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);
}
}
}
Channel ch = ...;
SocketChannelConfig cfg = (SocketChannelConfig) ch.getConfig();
cfg.settcpnodelay(false);
Option map是一个动态的只写属性,允许在不向下转换其关联的ChannelConfig的情况下配置一个Channel。
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都可以用
名称 关联的设置方法
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)
options.put(ChannelOption.SO_KEEPALIVE, true);
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NIOSocketChannel.class)
.remoteAddress(new InetSocketAddress("example.com", 80))
// 使用 ChannelOption 配置连接超时时间
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
Attribute
用于在Channel
中存储关联的元数据。可以将Attribute
看作是一个键值对,其中键是一个AttributeKey
类型的对象,而值是任意类型的Java对象。
Attribute
在网络应用中有着广泛的用途,例如:
Channel
的attr()
方法获取一个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
// ...
}
}
Constant
类是 Netty 框架提供的用于实现常量池的类,通常用于框架内部的常量定义,而不是用于业务代码的常量定义。AttributeKey
和 ChannelOption
都是 Netty 中用于为 Channel
和 ChannelConfig
存储属性的机制,它们的主要区别在于作用的范围和使用场景。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
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0