关于java:框架源码最佳实践摘录

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理