thrift的使用分为三个步骤:
1、创建接口描述文件,即demo.thrift文件;
1、创建接口描述文件,即demo.thrift文件;
2、通过thrift文件生成代码。(这个过程需要安装thrift的编译环境,过程有些繁琐。thrift使用C++编写的,所以编译环境是C++的环境。编译环境教程可以网上找,挺多的。)
生成代码命令:thrift -r -gen java -out "生成代码所在目录(目录必须存在)" thriftFileName。
-r : 递归寻找文件,一般在thrift文件中有引用其他文件的thrift文件时使用
-gen :指定生成的目标语言
-out :执行生成源代码的路径,也可以不指定,默认当前目录
注:1、用于生成代码的thrift文件可以在如下链接中获得:点击打开链接
3、编写服务端和客户端。(使用的是org.apache.thrift-0.11.0版本,不同版本的在客户端与服务端代码编写时,代码会有差异,但是核心都是由TTransport,TProtocol,TServer三个部分组成的。)
thrift服务端的创建:
//根据生成的代码创建processor。
//注:CalculatorHandler实现了Calculator.Iface接口,自定义了接口方法实现。
// Calculator.Iface是根据thrift文件中的定义内容生成的,需要自行成代码
CalculatorHandler handler = new CalculatorHandler();
Calculator.Processor processor = new Calculator.Processor(handler);
//服务端的创建,下面的每一个方法都一种服务端的创建方式,在外部直接调用就可以启动服务
public static void simple(Calculator.Processor processor) throws Exception{
TServerTransport tServerTransport = new TServerSocket(9090);
TServer tServer = new TSimpleServer(new TServer.Args(tServerTransport)
.processor(processor) //Transport和Protocol,客户端与服务端应该保持一致
.inputProtocolFactory(new TCompactProtocol.Factory())
.outputProtocolFactory(new TCompactProtocol.Factory())
.inputTransportFactory(new TZlibTransport.Factory())
.outputTransportFactory(new TZlibTransport.Factory()));
System.out.println("listen port 9090,Starting the simple server...");
tServer.serve();
}
public static void noblock(Calculator.Processor processor) throws Exception{
/**
* 非阻塞的socket,必须使用TFramedTransport和TCompactProtocol
* 作为其Transport和Protocol
*/
TNonblockingServerSocket socket = new TNonblockingServerSocket(9092);
TFramedTransport.Factory tframeFactory = new TFramedTransport.Factory();
TCompactProtocol.Factory tCompactProtocol = new TCompactProtocol.Factory();
TServer server = new THsHaServer(
new THsHaServer.Args(socket)
.processor(processor)//Transport和Protocol,客户端与服务端应该保持一致
.inputProtocolFactory(tCompactProtocol)
.inputTransportFactory(tframeFactory)
.outputProtocolFactory(tCompactProtocol)
.outputTransportFactory(tframeFactory));
System.out.println("listen port 9092,Starting the noblock server...");
server.serve();
}
public static void asynServer(Calculator.Processor processor) throws Exception{
/**
* 非阻塞的socket,必须使用TFramedTransport和TCompactProtocol
* 作为其Transport和Protocol
*/
TNonblockingServerSocket tServerTransport = new TNonblockingServerSocket(9093);
TServer tServer = new TThreadedSelectorServer(new TThreadedSelectorServer.Args(tServerTransport)
.processor(processor)//Transport和Protocol,客户端与服务端应该保持一致
.inputProtocolFactory(new TCompactProtocol.Factory())
.outputProtocolFactory(new TCompactProtocol.Factory())
.inputTransportFactory(new TFramedTransport.Factory())
.outputTransportFactory(new TFramedTransport.Factory()));
System.out.println("listen port 9093,Starting the asynServer server...");
tServer.serve();
}
public static void asynThreadPoolServer(Calculator.Processor processor) throws Exception{
TNonblockingServerSocket tServerTransport = new TNonblockingServerSocket(9094);
TServer tServer = new TThreadPoolServer(new TThreadPoolServer.Args(tServerTransport)
.processor(processor)
.inputProtocolFactory(new TCompactProtocol.Factory())
.outputProtocolFactory(new TCompactProtocol.Factory())
.inputTransportFactory(new TFastFramedTransport.Factory())
.outputTransportFactory(new TFastFramedTransport.Factory()));
System.out.println("listen port 9094,Starting the asynThreadPoolServer server...");
tServer.serve();
}
public static void tNonblockingServer(Calculator.Processor processor) throws Exception{
TNonblockingServerSocket tServerTransport = new TNonblockingServerSocket(9095);
TServer tServer = new TNonblockingServer(new TNonblockingServer.Args(tServerTransport)
.processor(processor)//Transport和Protocol,客户端与服务端应该保持一致
.inputProtocolFactory(new TCompactProtocol.Factory())
.outputProtocolFactory(new TCompactProtocol.Factory())
.inputTransportFactory(new TFastFramedTransport.Factory())
.outputTransportFactory(new TFastFramedTransport.Factory()));
System.out.println("listen port 9095,Starting the tNonblockingServer server...");
tServer.serve();
}
thrfit客户端的创建:
/**同步调用的客户端*/
TTransport tTransport= new TSocket("localhost",9092);
tTransport = new TFramedTransport.Factory().getTransport(tTransport);
tTransport.open();
TProtocol tProtocol = new TCompactProtocol(tTransport);
//注:创建服务端,调用方法。Calculator类和Work类都是根据thrift文件生成的类
Calculator.Client client = new Calculator.Client(tProtocol);
Work work = new Work();
work.op = Operation.DIVIDE;
work.num1 = 1;
work.num2 = 0;
try {
int calculate = client.calculate(1, work);
System.out.println("Whoa we can divide by 0");
}catch (invalidOperation ex ){
System.out.println("Invalid operation: " + ex.why);
}
/**异步调用的客户端*/
TAsyncClientManager clientManager = new TAsyncClientManager();
TProtocolFactory protocolFactory = new TCompactProtocol.Factory();
TNonblockingSocket socket = new TNonblockingSocket("localhost",9093);
Calculator.AsyncClient client = new Calculator.AsyncClient(protocolFactory,clientManager,socket);
ResultHandler resultHandler = new ResultHandler(); //自定义类,用户回调处理,实现了AsyncMethodCallback接口
Work work = new Work();
work.op = Operation.SUBTRACT;
work.num1 = 15;
work.num2 = 10;
try {
client.calculate(1, work,resultHandler);
}catch (invalidOperation ex ){
System.out.println("Invalid operation: " + ex.why);
}
Thread.sleep(5000);//需要等待返回,不然客户端会直接结束;客户端结束后就接收不到返回的结果了