在环境变量path中添加路径
namespace java thrift.generated
//编译命令 thrift --gen java src/thrift/data.thrift
//为数据类型起别名
typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String
struct Person{
1:optional String userName,
2:optional int age,
3:optional boolean married
}
exception DataException{
1:optional String message,
2:optional String callStack,
3:optional String date
}
service PersonService{
Person getPersonByUserName(1:required String userName) throws (1:DataException dataException),
void savePerson(1:required Person person) throws(1:DataException dataException)
}
-
编写实现类
public class PersonServiceImpl implements PersonService.Iface { @Override public Person getPersonByUserName(String userName) throws TException { System.out.println("userName:"+userName); Person person =new Person(); person.setUserName(userName); person.setAge(14); person.setMarried(false); return person; } @Override public void savePerson(Person person) throws TException { System.out.println("person:"+person); System.out.println(person.getUserName()); System.out.println(person.getAge()); System.out.println(person.isMarried()); } }
-
编写服务端
public class ThriftServer { public static void main(String[] args) throws TTransportException { /** * thrift支持的服务模型 * TSimpleServer 简单的单线程服务模型,常用于测试 * TThreadPoolServer 多线程服务模型,使用标准的阻塞式IO * TNonblockingServer 多线程服务模型,用用非阻塞式IO(需使用TFramedTransport数据传输方式) * THsHaServer -THsHa 引入了线程池去处理,其模型把读写任务放到线程池去处理;Half-sync/Half-async的处理模式,Half-async是在处理IO时间上(accept/read/write io) Half-sync用于handler对rpc的同步处理 */ TNonblockingServerSocket socket =new TNonblockingServerSocket(8899); THsHaServer.Args arg =new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4); PersonService.Processor<PersonServiceImpl> processor =new PersonService.Processor<>(new PersonServiceImpl()); /** * 数据协议/格式 * TBinaryProtocol 二进制格式 * TCompactProtocol 压缩格式 * TJSONProtocol json格式 * TSimpleJSONProtocol 提供json只写协议,生成的文件很容易通过脚本语言解析 * TDebugProtocol 使用易懂的可读的文本格式,以便于debug */ arg.protocolFactory(new TCompactProtocol.Factory()); /** * 数据传输方式 * TSocket 阻塞式socket * TFramedTransport 以frame为单位进行传输,非阻塞式服务中使用 * TFileTransport 以文件形式进行传输 * TMemoryTransport 将内存用于I/O,java实现时内部实际使用了简单的ByteArrayOutPutStream * TZliTransport 使用zlib进行压缩,与其它传输方式联合使用,当前无java实现 */ arg.transportFactory(new TFastFramedTransport.Factory()); arg.processorFactory(new TProcessorFactory(processor)); TServer server =new THsHaServer(arg); System.out.println("thrift server started!"); server.serve(); } }
-
编写客户端
public class ThriftClient { public static void main(String[] args) { TTransport transport = new TFastFramedTransport(new TSocket("localhost", 8899), 600); TProtocol protocol = new TCompactProtocol(transport); PersonService.Client client = new PersonService.Client(protocol); try { transport.open(); Person person = client.getPersonByUserName("张三"); System.out.println(person.getUserName()); Person p =new Person(); p.setUserName("李四"); p.setAge(14); p.setMarried(true); client.savePerson(p); } catch (Exception e) { e.printStackTrace(); } finally { transport.close(); } } }