概述
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使用非阻塞模式TNonblockingServer所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复