thirft使用非阻塞模式TNonblockingServer
来源:互联网 发布:java webservice部署 编辑:程序博客网 时间:2024/06/01 08:57
TNonblockingServer —— 多线程服务器端使用非阻塞式 I/O
TFramedTransport —— 使用非阻塞方式,按块的大小进行传输,类似于 Java 中的 NIO
若使用 TFramedTransport 传输层,其服务器必须修改为非阻塞的服务类型
TNonblockingServer工作模式,该模式也是单线程工作,但是该模式采用NIO的方式,所有的socket都被注册到selector中,在一个线程中通过seletor循环监控所有的socket,每次selector结束时,处理所有的处于就绪状态的socket,对于有数据到来的socket进行数据读取操作,对于有数据发送的socket则进行数据发送,对于监听socket则产生一个新业务socket并将其注册到selector中
上图中读取数据之后的业务处理就是根据读取到的调用请求,调用具体函数完成处理,只有完成函数处理才能进行后续的操作;
TNonblockingServer模式优点:
相比于TSimpleServer效率提升主要体现在IO多路复用上,TNonblockingServer采用非阻塞IO,同时监控多个socket的状态变化;
TNonblockingServer模式缺点:
TNonblockingServer模式在业务处理上还是采用单线程顺序来完成,在业务处理比较复杂、耗时的时候,例如某些接口函数需要读取数据库执行时间较长,此时该模式效率也不高,因为多个调用请求任务依然是顺序一个接一个执行。
服务端代码
private static void nonblockingServer() throws TTransportException { TNonblockingServerTransport serverSocket=new TNonblockingServerSocket(8888); TNonblockingServer.Args serverParams=new TNonblockingServer.Args(serverSocket); serverParams.protocolFactory(new TBinaryProtocol.Factory()); serverParams.transportFactory(new TFramedTransport.Factory()); //非阻塞 serverParams.processor(new ISayHello.Processor<Iface>(new SayHelloImpl())); TServer server=new TNonblockingServer(serverParams); //简单的单线程服务模型,常用于测试 server.serve(); }
同步客户端代码:
private static void nonblockingSocket() throws Exception { TTransport transport = new TFramedTransport(new TSocket("localhost", 8888)); //非阻塞 TProtocol protocol = new TBinaryProtocol(transport); ISayHello.Client client = new ISayHello.Client(protocol); transport.open(); int i = 5; while (i > 0) { System.out.println("client调用返回:" + client.sayHello("张三")); i--; } transport.close(); }
异步客户端代码:
private static void asyncClient() throws Exception { TAsyncClientManager clientManager = new TAsyncClientManager(); TNonblockingTransport transport = new TNonblockingSocket("localhost", 8888); Factory factory = new TBinaryProtocol.Factory(); ISayHello.AsyncClient asyncClient = new ISayHello.AsyncClient(factory, clientManager, transport); System.out.println("Client calls ....."); MethodCallback callBack = new MethodCallback(); asyncClient.sayHello("李四", callBack); Object res = callBack.getResult(); while (res == null) { res = callBack.getResult(); } System.out.println(((ISayHello.AsyncClient.sayHello_call) res).getResult()); }
MethodCallback类:
/* * 文件名:MethodCallback.java * 版权:Copyright 2007-2017 517na Tech. Co. Ltd. All Rights Reserved. * 描述: MethodCallback.java * 修改人:peiyu * 修改时间:2017年3月16日 * 修改内容:新增 */package com.thirft.client;import org.apache.thrift.async.AsyncMethodCallback;/** * @author peiyu */public class MethodCallback implements AsyncMethodCallback<Object> { Object response = null; public Object getResult() { // 返回结果值 return this.response; } // 处理服务返回的结果值 @Override public void onComplete(Object response) { this.response = response; } // 处理调用服务过程中出现的异常 @Override public void onError(Exception paramException) { // TODO Auto-generated method stub } }
- thirft使用非阻塞模式TNonblockingServer
- thirft使用THsHaServer模式
- thirft使用TSimpleServer模式
- thirft使用TThreadedSelectorServer模式
- Thrift 非阻塞式IO服务模型-TNonblockingServer
- select非阻塞模式使用
- TcpListener 阻塞、非阻塞模式
- socket阻塞非阻塞模式
- 非阻塞模式
- select 模式 非阻塞
- 非阻塞模式
- 非阻塞模式
- 非阻塞模式
- 非阻塞模式
- PHP非阻塞模式
- 非阻塞模式开发
- socket 非阻塞模式
- 非阻塞模式
- Maven管理的jar没有发布到WEB-INF/lib下的解决方案
- Codeforces Round #404 (Div. 2) B. Anton and Classes
- 如何快速转载csdn上的博客
- 类似coc这种全球同服,并且注册玩家与在线玩家庞大的游戏,服务器端架构该如何设计呢?
- Error running app: This version of Android Studio is incompatible with the Gradle Plugin used.
- thirft使用非阻塞模式TNonblockingServer
- android studio 现有项目集成Phonegap
- 开个博客,记录点滴
- redisMQ消费消息的机制
- 含有max、绝对值等式化简汇总
- 知乎上35条神回复,针针见血,看完整个人通透多了
- Dragger2 入门使用用法 参照博文自己领悟使用解析
- win 磁盘重分区
- uva10670