框架源码最佳实践摘录

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

你可能感兴趣的:(java源码最佳实践)