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    }  }
0 0