thrift java 异步_Apache Thrift - java开发详解[转]

1、添加依赖 jar

org.apache.thriftlibthrift0.8.0org.slf4jslf4j-log4j121.6.1

2、编写IDL文件 Hello.thrift

namespace java service.demo

service Hello {

string helloString(1:string para)

i32 helloInt(1:i32 para)

bool helloBoolean(1:bool para)

void helloVoid()

string helloNull()

}

3、生成代码

thrift -o -gen java Hello.thrift生成代码缩略图:

1344246293_5921.jpg

4、编写实现类、实现Hello.Iface:

缩略图:

1344246424_7730.jpg

5、编写服务端,发布(阻塞式IO + 多线程处理)服务。

/**

* 阻塞式、多线程处理

*

* @param args

*/

@SuppressWarnings({ "unchecked", "rawtypes" })

public static void main(String[] args) {

try {

//设置传输通道,普通通道

TServerTransport serverTransport = new TServerSocket(7911);

//使用高密度二进制协议

TProtocolFactory proFactory = new TCompactProtocol.Factory();

//设置处理器HelloImpl

TProcessor processor = new Hello.Processor(new HelloImpl());

//创建服务器

TServer server = new TThreadPoolServer(

new Args(serverTransport)

.protocolFactory(proFactory)

.processor(processor)

);

System.out.println("Start server on port 7911...");

server.serve();

} catch (Exception e) {

e.printStackTrace();

}

}

6、编写客户端,调用(阻塞式IO + 多线程处理)服务:

public static void main(String[] args) throws Exception {

// 设置传输通道 - 普通IO流通道

TTransport transport = new TSocket("localhost", 7911);

transport.open();

//使用高密度二进制协议

TProtocol protocol = new TCompactProtocol(transport);

//创建Client

Hello.Client client = new Hello.Client(protocol);

long start = System.currentTimeMillis();

for(int i=0; i<10000; i++){

client.helloBoolean(false);

client.helloInt(111);

client.helloNull();

client.helloString("dongjian");

client.helloVoid();

}

System.out.println("耗时:" + (System.currentTimeMillis() - start));

//关闭资源

transport.close();

}

现在已完成整个开发过程,超级无敌简单。

其中服务端使用的协议需要与客户端保持一致。

-------------------------------------------------------------------------------------------------------------------

上面展示了普通且常用的服务端和客户端,下面请看非阻塞IO,即java中的NIO:

基于非阻塞IO(NIO)的服务端:

public static void main(String[] args) {

try {

//传输通道 - 非阻塞方式

TNonblockingServerTransport serverTransport = new TNonblockingServerSocket(7911);

//异步IO,需要使用TFramedTransport,它将分块缓存读取。

TTransportFactory transportFactory = new TFramedTransport.Factory();

//使用高密度二进制协议

TProtocolFactory proFactory = new TCompactProtocol.Factory();

//设置处理器 HelloImpl

TProcessor processor = new Hello.Processor(new HelloImpl());

//创建服务器

TServer server = new TThreadedSelectorServer(

new Args(serverTransport)

.protocolFactory(proFactory)

.transportFactory(transportFactory)

.processor(processor)

);

System.out.println("Start server on port 7911...");

server.serve();

} catch (Exception e) {

e.printStackTrace();

}

}

调用非阻塞IO(NIO)服务的客户端:

public static void main(String[] args) throws Exception {

//设置传输通道,对于非阻塞服务,需要使用TFramedTransport,它将数据分块发送

TTransport transport = new TFramedTransport(new TSocket("localhost", 7911));

transport.open();

//使用高密度二进制协议

TProtocol protocol = new TCompactProtocol(transport);

//创建Client

Hello.Client client = new Hello.Client(protocol);

long start = System.currentTimeMillis();

for(int i=0; i<10000; i++){

client.helloBoolean(false);

client.helloInt(111);

client.helloNull();

client.helloString("360buy");

client.helloVoid();

}

System.out.println("耗时:" + (System.currentTimeMillis() - start));

//关闭资源

transport.close();

}

-----------------------------------------------------------------------------------------------------------------------------------

客户端异步调用:

/** 调用[非阻塞IO]服务,异步 */

public static void main(String[] args) {

try {

//异步调用管理器

TAsyncClientManager clientManager = new TAsyncClientManager();

//设置传输通道,调用非阻塞IO。

final TNonblockingTransport transport = new TNonblockingSocket("localhost", 7911);

//设置协议

TProtocolFactory protocol = new TCompactProtocol.Factory();

//创建Client

final Hello.AsyncClient client = new Hello.AsyncClient(protocol, clientManager, transport);

// 调用服务

System.out.println("开始:" + System.currentTimeMillis());

client.helloBoolean(false, new AsyncMethodCallback() {

public void onError(Exception exception) {

System.out.println("错误1: " + System.currentTimeMillis());

}

public void onComplete(helloBoolean_call response) {

System.out.println("完成1: " + System.currentTimeMillis());

try {

client.helloBoolean(false, new AsyncMethodCallback() {

public void onError(Exception exception) {

System.out.println("错误2: " + System.currentTimeMillis());

}

public void onComplete(helloBoolean_call response) {

System.out.println("完成2: " + System.currentTimeMillis());

transport.close();

}

});

} catch (TException e) {

e.printStackTrace();

}

}

});

System.out.println("结束:" + System.currentTimeMillis());

Thread.sleep(5000);

} catch (Exception e) {

e.printStackTrace();

}

}

-----------------------------------------------------------------------------------------------------------------------------------

使用SSL的服务端:

1344247527_4406.jpg

调用基于SSL服务端的客户端:

1344247606_9192.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值