聊聊Thrift(三) thrift 服务篇-TThreadPoolServer

聊聊Thrift(三) thrift 服务篇-TThreadPoolServer

上一篇文章列举了3中主要的服务端的模式,是我们工作中主要使用的模式,包括2种非阻塞的模式(TNonblockingServer ,TThreadedSelectorServer )和一种阻塞的模式(TThreadPoolServer ),本文深入这三种模式进行逐一讲解,先从TThreadPoolServer 开始深入。

TThreadPoolServer

Server which uses Java's built in ThreadPool management to spawn off a worker pool that

TThreadPoolServer是thrift提供的阻塞的服务端模式,启动一个线程池来处理并发的RPC请求。TThreadPoolServer继承TServer,继承关系见下:
这里写图片描述
class的structure见下:
这里写图片描述
通过以下构造函数创建,在构造函数中会创建工作线程池,用来executorService_用来处理RPC请求,根据args参数判断用户是否自己设置了线程池,如未设置,就根据传递进来的参数创建线程池,使用ThreadPoolExecutor创建
corePoolSize:5
maximumPoolSize:用户设置
keepAliveTime:60
unit:TimeUnit.SECONDS
workQueue:用户设置

构造函数:

public TThreadPoolServer(Args args) {
  super(args);

  stopTimeoutUnit = args.stopTimeoutUnit;
  stopTimeoutVal = args.stopTimeoutVal;

  executorService_ = args.executorService != null ?
      args.executorService : createDefaultExecutorService(args);
}

创建线程池:

private static ExecutorService createDefaultExecutorService(Args args) {
  SynchronousQueue<Runnable> executorQueue =
    new SynchronousQueue<Runnable>();
  return new ThreadPoolExecutor(args.minWorkerThreads,
                                args.maxWorkerThreads,
                                60,
                                TimeUnit.SECONDS,
                                executorQueue);
}

serve为服务端的监听socket,处理业务请求的方法,流程如下:
这里写图片描述
通过上图可以看到,属于一个典型的阻塞IO,使用了线程池提供处理用户请求的速度
accept用户连接:serverTransport_.accept()->acceptImpl()->ServerSocket.accept()
工作线程:

while (!stopped_) {
  int failureCount = 0;
  try {
    TTransport client = serverTransport_.accept();
    WorkerProcess wp = new WorkerProcess(client);
    while(true) {
      int rejections = 0;
      try {
        executorService_.execute(wp);
        break;
      } catch(RejectedExecutionException ex) {
        LOGGER.warn("ExecutorService rejected client " + (++rejections) +
            " times(s)", ex);
        try {
          TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
          LOGGER.warn("Interrupted while waiting to place client on" +
              " executor queue.");
          Thread.currentThread().interrupt();
          break;
        }
      }
    }
  } catch (TTransportException ttx) {
    if (!stopped_) {
      ++failureCount;
      LOGGER.warn("Transport error occurred during acceptance of message.", ttx);
    }
  }
}

根据设置好序列化反序列化以及传输协议,接受用户请求后提交给线程池执行,处理,调用如下代码段处理

processor.process(inputProtocol, outputProtocol)
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值