共计 1421 个字符,预计需要花费 4 分钟才能阅读完成。
Vertx 框架
1.Holder 应用
Holder 是把具备强关联性的信息打包在一起不便同时更新,如 EventLoopHolder,VerticleHolder。
VertxEventLoopGroup 增加 woker,然而实际上包了一层 EventLoopHolder,因为 woker 和 woker 的 handler count 密切相关。
private static class EventLoopHolder {
int count = 1;
final EventLoop worker;
EventLoopHolder(EventLoop worker) {this.worker = worker;}
2. 轮询实现
VertxEventLoopGroup 对外提供 next 办法,一直调用 next 就是一直遍历列表过程,起到轮询作用。
@Override
public synchronized EventLoop next() {if (workers.isEmpty()) {throw new IllegalStateException();
} else {EventLoop worker = workers.get(pos).worker;
pos++;
checkPos();
return worker;
}
}
3. 面向对象继承,拓展框架性能,为我所用
netty 的 ServerBootstrap 原型是 group(EventLoopGroup parentGroup, EventLoopGroup childGroup)
个别应用 netty 都是用 netty 的 NioEventLoopGroup 作为 I / O 线程组,但 vertx 框架没有应用 NioEventLoopGroup,而是 VertxEventLoopGroup,定制 vertx 须要的简略性能,增加额定的操作 public synchronized void addWorker(EventLoop worker), 这个是 NioEventLoopGroup 所没有的,然而这个 addWorker 动静退出 woker,是 Vertx 多个 verticle 实例共享 listen port 的一个必要路径。
另外,之所以能够拓展,蕴含一个软件设计思维,是 netty 的框架 group 入参是 Interface,依赖形象,而不是依赖具体实现。
ServerBootstrap bootstrap = new ServerBootstrap();
// getAcceptorEventLoopGroup 是一个 NioEventLoopGroup,但 workers 是 VertxEventLoopGroup, 便于 vertx 框架拓展
bootstrap.group(vertx.getAcceptorEventLoopGroup(), channelBalancer.workers());
public final class VertxEventLoopGroup extends AbstractEventExecutorGroup implements EventLoopGroup {
// vertx 拓展增加
public synchronized void addWorker(EventLoop worker) {EventLoopHolder holder = findHolder(worker);
if (holder == null) {workers.add(new EventLoopHolder(worker));
} else {holder.count++;}
}
}
正文完