thirft使用THsHaServer模式

THsHaServer:半同步半异步的服务模型,一个单独的线程用来处理网络I/O,一个worker线程池用来进行消息的处理
半同步半异步的服务端模型,需要指定为: TFramedTransport 数据传输的方式。

THsHaServer类是TNonblockingServer类的子类,在TNonblockingServer模式中,采用一个线程来完成对所有socket的监听和业务处理,造成了效率的低下,THsHaServer模式的引入则是部分解决了这些问题。THsHaServer模式中,引入一个线程池来专门进行业务处理

这里写图片描述

THsHaServer的优点:
与TNonblockingServer模式相比,THsHaServer在完成数据读取之后,将业务处理过程交由一个线程池来完成,主线程直接返回进行下一次循环操作,效率大大提升;
THsHaServer的缺点:
主线程需要完成对所有socket的监听以及数据读写的工作,当并发请求数较大时,且发送数据量较多时,监听socket上新连接请求不能被及时接受。

服务端代码:

private static void hsHaServer() throws TTransportException {
        TNonblockingServerTransport serverSocket=new TNonblockingServerSocket(8888); 
        THsHaServer.Args serverParams=new THsHaServer.Args(serverSocket);
        serverParams.protocolFactory(new TBinaryProtocol.Factory());
        serverParams.transportFactory(new TFramedTransport.Factory());
        serverParams.processor(new ISayHello.Processor<Iface>(new SayHelloImpl()));
        TServer server=new THsHaServer(serverParams); //简单的单线程服务模型,常用于测试
        server.serve();
    }

客户端代码:

private static void hsHaClient() throws Exception {
        //异步调用管理器  
        TAsyncClientManager clientManager = new TAsyncClientManager();
        //设置传输通道,调用非阻塞IO  
        TNonblockingTransport transport = new TNonblockingSocket("localhost", 8888);
        //协议要和服务端一致  
        TProtocolFactory tprotocol = new TBinaryProtocol.Factory();
        ISayHello.AsyncClient asyncClient = new ISayHello.AsyncClient(tprotocol, clientManager, transport);
        CountDownLatch latch = new CountDownLatch(1);
        MethodCallback callBack = new MethodCallback(latch);
        System.out.println("call method sayHello start ...");
        // 调用服务  
        asyncClient.sayHello("jack", callBack);
        System.out.println("call method sayHello .... end");
        //等待完成异步调用  
        boolean wait = latch.await(30, TimeUnit.SECONDS);
        System.out.println("latch.await =:" + wait);
    }

MethodCallback类:

/*
 * 文件名:MethodCallback.java
 * 版权:Copyright 2007-2017 517na Tech. Co. Ltd. All Rights Reserved. 
 * 描述: MethodCallback.java
 * 修改人:peiyu
 * 修改时间:2017年3月16日
 * 修改内容:新增
 */
package com.thirft.client;

import java.util.concurrent.CountDownLatch;

import org.apache.thrift.async.AsyncMethodCallback;

/**
 * @author peiyu
 */
public class MethodCallback implements AsyncMethodCallback<Object> {
    private Object response = null;
    private CountDownLatch latch;
    public MethodCallback() {
    }
    public MethodCallback(CountDownLatch latch) {
        this.latch = latch;
    }
    public Object getResult() {
        // 返回结果值
        return this.response;
    }
    // 处理服务返回的结果值
    @Override
    public void onComplete(Object response) {
        this.response = response;
        latch.countDown();
    }
    // 处理调用服务过程中出现的异常
    @Override
    public void onError(Exception paramException) {
        latch.countDown();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值