可以在源代码lib/java中获得jar包。代码、接口示例可参考thrift源代码中的tutorial/tutorial.thrift,tutorial/java。使用:
一、定义接口IDL:xxx.thrift。支持的数据类型有:bool;byte: 有符号字节;i16: 16位有符号整型;i32: 32位有符号整型;i64: 64位有符号整型;double: 64位浮点型;string。其他类型有list、set、map、struct、exception、enum等。包用namespace/include声明/调用(类似c++)。服务接口用service声明,其中声明多个接口。
namespace java com.thrift.test.user //需要指定语言,否则生成代码报错。 struct User { //不支持继承 1: required i32 id; //每个域都有一个唯一数字标签,这些数字标签在传输时用来确定域 2: required string name; } service UserService { i32 getId(1: User user); void setName(1: User user, 2: string s); }参考:http://www.cnblogs.com/tianhuilove/archive/2011/09/05/2167669.html
二、通过thrift.exe,将IDL生成为代码,如thrift.exe -r -gen java test.thrift(-r对其中include的文件也生成服务代码)。生成的类有2个,User.java和UserService.java,分别对应结构体和服务。若有多个结构体或多个服务,就会生成多个对应的类。除此之外,若接口中定义了const常量,还会生成一个xxxConstants类。
在User.java中IDL结构体的域对应为_Fields,是一个enum型,这也就理解了定义中域的数字标签的意义,可以根据数字标签找到相应的域
public static _Fields findByThriftId(int fieldId) { switch(fieldId) { case 1: // ID return ID; case 2: // NAME return NAME; default: return null; } }另外,在该类中还提供了与的get/set、比较、toString、序列化以及read/write等操作
在UserService类中定义了Iface、AsyncIface接口以及client、AsyncClient、Processor、AsyncProcessor等类,其中有对接口方法的send_xxx,recv_xxx等操作,不需要动这个类。
三、自定义服务处理类UserHandler实现UserService.Iface/AsyncIface接口。其中对服务方法进行具体处理。
四、构建服务端监听方法。
public static void server() { try { Calculator.Processor processor = new UserService.Processor(new UserHandler()); TServerTransport serverTransport = new TServerSocket(9090); TServer server = new TSimpleServer(new Args(serverTransport).processor(processor)); // Use this for a multithreaded server // TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor)); server.serve(); } catch (Exception e) { e.printStackTrace(); } }
五、构建客户端请求方法。
public static void main(String [] args) { try { TTransport transport = new TSocket("xxxx", 9090); transport.open(); TProtocol protocol = new TBinaryProtocol(transport); UserService.Client client = new UserService.Client(protocol); perform(client); //调用接口提供的服务 transport.close(); } catch (TException x) { x.printStackTrace(); } }