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++;
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。