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++; } }}