thirft使用非阻塞模式TNonblockingServer

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

    } 
 }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值