Thrift 开发教程

javale

贡献于2012-11-28

字数:6617 关键词: WEB服务/RPC/SOA

1 编写thrift文件(如aa.thrift) namespace java com.tv189.uc.thrift namespace cpp thrift.vdb namespace rb thrift.vdb namespace perl thrift.vdb namespace csharp thrift.vdb namespace js thrift.vdb namespace st thrift.vdb namespace py thrift.vdb namespace php thrift service UCThriftService{ string ucOperator(1:string actionType, 2:string uid, 3:string data), } 2 生成java文件 thrift-0.6.0.exe -r --gen java uc.thrift thrift-0.6.0.exe -r --gen java uc.thrift thrift-0.6.0.exe -r --gen php uc.thrift thrift-0.6.0.exe -r --gen py uc.thrift 可以生成php,py等等的 3 服务端编写 1)实现 UCThriftService.Iface public class UCThriftServiceImpl implements UCThriftService.Iface { public static Logger logger = Logger.getLogger(UCThriftServiceImpl.class); @Override public String ucOperator(String actionType, String suid, String data) throws TException { System.out.println("test"); } } 2)运行的main编写 public class UCServiceServer { private static Logger logger = Logger.getLogger(UCServiceServer.class); public static void main(String... args) throws Exception { //这个是用properties编写的,可以自行决定 String server = PropertiesUtil.getValue("tserver.properties","ucserver.nio","hahs"); if ("nio".equalsIgnoreCase(server)) { startNIO(); } if ("hahs".equalsIgnoreCase(server)) { startHAHS(); } else { start(); } } private static void start() throws TTransportException { String address = PropertiesUtil.getValue("tserver.properties","ucserver.address","0.0.0.0"); int port = Integer.parseInt(PropertiesUtil.getValue("tserver.properties","ucserver.port","5555")); int clientTimeout = Integer.parseInt(PropertiesUtil.getValue("tserver.properties","ucserver.clientTimeout","30000")); int minWorkerThreads = Integer.parseInt(PropertiesUtil.getValue("tserver.properties","ucserver.minWorkerThreads","25")); int maxWorkerThreads = Integer.parseInt(PropertiesUtil.getValue("tserver.properties","ucserver.maxWorkerThreads","25")); String protocol = PropertiesUtil.getValue("tserver.properties","ucserver.protocol","binary"); TServerSocket socket = new TServerSocket(new InetSocketAddress(address, port), clientTimeout); UCThriftService.Processor process = new UCThriftService.Processor( UCThriftServiceImpl.instance()); TThreadPoolServer.Args arg = new TThreadPoolServer.Args(socket); if("compact".equalsIgnoreCase(protocol)){ arg.protocolFactory(new TCompactProtocol.Factory()); }else if("binary".equalsIgnoreCase(protocol)){ arg.protocolFactory(new TBinaryProtocol.Factory()); }else{ arg.protocolFactory(new TBinaryProtocol.Factory()); } arg.transportFactory(new TFramedTransport.Factory()); arg.maxWorkerThreads(maxWorkerThreads); arg.minWorkerThreads(minWorkerThreads); // arg.processor(process); arg.processorFactory(new TProcessorFactory(process)); TServer server = new TThreadPoolServer(arg); Logger.getLogger(UCServiceServer.class).info( UCServiceServer.class.getSimpleName() + " Listen at " + port); while(true){ try { server.serve(); } catch (Exception e) { logger.error(e.getMessage(),e); server.stop(); Logger.getLogger(UCServiceServer.class).info( UCServiceServer.class.getSimpleName() + " Reload"); server = new TThreadPoolServer(arg); } } } private static void startNIO() throws TTransportException { String address = PropertiesUtil.getValue("tserver.properties","ucserver.address","0.0.0.0"); int port = Integer.parseInt(PropertiesUtil.getValue("tserver.properties","ucserver.port","5555")); int clientTimeout = Integer.parseInt(PropertiesUtil.getValue("tserver.properties","ucserver.clientTimeout","30000")); String protocol = PropertiesUtil.getValue("tserver.properties","ucserver.protocol","binary"); TNonblockingServerSocket socket = new TNonblockingServerSocket( new InetSocketAddress(address, port), clientTimeout); UCThriftService.Processor process = new UCThriftService.Processor( UCThriftServiceImpl.instance()); TNonblockingServer.Args arg = new TNonblockingServer.Args(socket); if("compact".equalsIgnoreCase(protocol)){ arg.protocolFactory(new TCompactProtocol.Factory()); }else if("binary".equalsIgnoreCase(protocol)){ arg.protocolFactory(new TBinaryProtocol.Factory()); }else{ arg.protocolFactory(new TBinaryProtocol.Factory()); } arg.transportFactory(new TFramedTransport.Factory()); // arg.processor(process); arg.processorFactory(new TProcessorFactory(process)); TServer server = new TNonblockingServer(arg); Logger.getLogger(UCServiceServer.class).info( "NIO " + UCServiceServer.class.getSimpleName() + " Listen at " + port); while(true){ try { server.serve(); } catch (Exception e) { server.stop(); Logger.getLogger(UCServiceServer.class).info( "NIO " + UCServiceServer.class.getSimpleName() + " Reload"); server = new TNonblockingServer(arg); } } } private static void startHAHS() throws TTransportException { String address = PropertiesUtil.getValue("tserver.properties","ucserver.address","0.0.0.0"); int port = Integer.parseInt(PropertiesUtil.getValue("tserver.properties","ucserver.port","5555")); int clientTimeout = Integer.parseInt(PropertiesUtil.getValue("tserver.properties","ucserver.clientTimeout","30000")); int minWorkerThreads = Integer.parseInt(PropertiesUtil.getValue("tserver.properties","ucserver.minWorkerThreads","25")); String protocol = PropertiesUtil.getValue("tserver.properties","ucserver.protocol","binary"); TNonblockingServerSocket socket = new TNonblockingServerSocket( new InetSocketAddress(address, port), clientTimeout); UCThriftService.Processor process = new UCThriftService.Processor( UCThriftServiceImpl.instance()); THsHaServer.Args arg = new THsHaServer.Args(socket); if("compact".equalsIgnoreCase(protocol)){ arg.protocolFactory(new TCompactProtocol.Factory()); }else if("binary".equalsIgnoreCase(protocol)){ arg.protocolFactory(new TBinaryProtocol.Factory()); }else{ arg.protocolFactory(new TBinaryProtocol.Factory()); } arg.transportFactory(new TFramedTransport.Factory()); arg.workerThreads(minWorkerThreads); // arg.processor(process); arg.processorFactory(new TProcessorFactory(process)); TServer server = new THsHaServer(arg); Logger.getLogger(UCServiceServer.class).info( "HAHS " + UCServiceServer.class.getSimpleName() + " Listen at " + port); while(true){ try { server.serve(); } catch (Exception e) { logger.error(e.getMessage(),e); server.stop(); Logger.getLogger(UCServiceServer.class).info( "HAHS " + UCServiceServer.class.getSimpleName() + " Reload"); server = new TNonblockingServer(arg); } } } } 4 客户端编写 public void newThread() throws TException { String address = "0.0.0.0"; int port = 5555; int clientTimeout = 30000; TTransport transport = new TFramedTransport(new TSocket(address, port, clientTimeout)); TProtocol protocol = new TBinaryProtocol(transport); UCThriftService.Client client = new UCThriftService.Client(protocol); transport.open(); try { long bt = System.currentTimeMillis(); System.out.println(URLDecoder.decode(client.ucOperator("get", "29", ""))); } catch (TApplicationException e) { System.out.println(e.getMessage() + " " + e.getType()); } transport.close(); } 5运行 先运行ucserver client连接可在控制台看到输出 说明: client连服务端有几个要注意的地方: 1 服务器的ip和端口 2 服务端和客户端用的 transport 和协议一定要一样 比如: 如果服务端用的TFrameTransport 那客户端也要用TFrameTransport 如果服务端用的TBinaryProtocol,那客户端也要用TBinaryProtocol 否则会出一个好像是TTransportException的一个异常。

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档