没有合适的资源?快使用搜索试试~ 我知道了~
Netty4事件处理传播机制,java高级开发工程师要求(csdn)————程序.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 176 浏览量
2021-12-03
10:32:21
上传
评论
收藏 497KB PDF 举报
温馨提示
试读
16页
Netty4事件处理传播机制,java高级开发工程师要求(csdn)————程序
资源推荐
资源详情
资源评论
final AbstractChannelHandlerContext head
final AbstractChannelHandlerContext tail
private final Channel channel
protected DefaultChannelPipeline(Channel channel) {
this.channel = ObjectUtil.checkNotNull(channel, “channel”);
tail = new TailContext(this);
head = new HeadContext(this);
head.next = tail;
tail.prev = head;
}
从这里看一个 Channel 对应一个 ChannelPipeline。
2.1 事件链构建
本节将以 addFirst 方法为例展示 ChannelPipeline 事件链的维护实现。
DefaultChannelPipeline#addFirst
public final ChannelPipeline addFirst(String name, ChannelHandler
handler) {
return addFirst(null, name, handler);
}
内部调用其重载方法。接下来重点分析该方法
public final ChannelPipeline addFirst(EventExecutorGroup group,
String name, ChannelHandler handler) { // @1
final AbstractChannelHandlerContext newCtx;
synchronized (this) {
checkMultiplicity(handler); // @2
name = filterName(name, handler);
newCtx = newContext(group, name, handler); // @3
addFirst0(newCtx); // @4
// If the registered is false it means that the channel was not
registered on an eventloop yet.
// In this case we add the context to the pipeline and add a task
that will call
// ChannelHandler.handlerAdded(…) once the channel is registered.
if (!registered) { // @5
newCtx.setAddPending();
callHandlerCallbackLater(newCtx, true);
return this;
}
EventExecutor executor = newCtx.executor();
if (!executor.inEventLoop()) { // @6
newCtx.setAddPending();
executor.execute(new Runnable() {
@Override
public void run() {
callHandlerAdded0(newCtx);
}
});
return this;
}
}
callHandlerAdded0(newCtx); // @7
return this;
}
代码@1:首先对参数简单说明一下:
• EventExecutorGroup group:指定 ChannelHandler 在哪个事件选择器中
执行(EventLoopGroup),如果为空,表示在 Channel 注册的事件轮询器
中执行。
• String name:ChannelHandler 名称。
• ChannelHandler channelHandler:待添加的事件处理器。
代码@2:检查是否重复添加,声明为 Shareable 的 ChannelHandler 允许重复添
加。
代码@3:使用 AbstractChannelHandlerContext 类包装 ChannelHandler,即双
链表结构的 Node 类为 AbstractChannelHandlerContext。
代码@4:将 AbstractChannelHandlerContext 调用 addFirst0 添加到双链表的
“第一条”,其实是添加到双链表头结点(HeaderContext)的 next 值执行该节
点。
代码@5-代码@7 都是处理 handerAdd 事件,如果通道还未注册,handerAdd 事件
会“挂起”,也就是需要等待通道被注册后才执行,其实现思路也是构建
PendingHandlerCallback 链,DefaultChannelPipeline 内部持有该链的头节
点,待通道注册后,顺序触发 handlerAdd 事件的传播。
接下来看一下 addFirst0 的执行:
private void addFirst0(AbstractChannelHandlerContext newCtx) {
AbstractChannelHandlerContext nextCtx = head.next;
newCtx.prev = head;
newCtx.next = nextCtx;
head.next = newCtx;
nextCtx.prev = newCtx;
}
这里就是典型的链表操作过程。
如果使用如下代码构建事件链,那事件是如何传播的呢?
p.addLast(“1”, new InboundHandlerA());
p.addLast(“2”, new InboundHandlerB());
p.addLast(“3”, new OutboundHandlerA());
p.addLast(“4”, new OutboundHandlerB());
p.addLast(“5”, new InboundOutboundHandlerX());
其构建的事件链最终如图所示:
但 ChannelInboundHandler 中的事件是如何传播的呢?
ChannelOutboundHandler 的事件又是如何传播的呢?
剩余15页未读,继续阅读
资源评论
一诺网络技术
- 粉丝: 0
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功