聊聊Thrift(三) thrift 服务篇-TThreadPoolServer
来源:互联网 发布:java项目视频教程 编辑:程序博客网 时间:2024/06/13 05:15
聊聊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)
- 聊聊Thrift(三) thrift 服务篇-TThreadPoolServer
- 聊聊Thrift(四) thrift 服务篇-TNonblockingServer
- Thrift 多线程阻塞式IO服务模型-TThreadPoolServer
- 聊聊Thrift(一) 基础
- java thrift TSimpleServer TNonblockingServer THsHaServer TThreadedSelectorServer TThreadPoolServer比较
- Thrift
- thrift
- thrift
- thrift
- Thrift
- Thrift
- thrift
- thrift
- thrift
- Thrift
- thrift
- Thrift
- Thrift
- Strategic Game 【无向图的最小顶点覆盖】
- 二叉树前序、中序、后序递归遍历实现(C语言)
- 有趣的编程----控制自己电脑的CPU
- Python3 如何优雅地使用正则表达式(详解五)
- 为什么要写blog????
- 聊聊Thrift(三) thrift 服务篇-TThreadPoolServer
- 工作中碰到的git命令总结(会持续更新~~)
- 一个多线程断点续传的案例
- 如何让.gitignore文件生效
- 简述Handler
- iOS判断一段字符串长度(汉字2字节)
- Android源码之单双摄像头修改
- centos 6.5安装redis
- VMware12下Linux网络配置