thrift 开发教程
2011-05-27 15:27:29| 分类: | 标签: |字号 大中小
1 编写thrift文件(如aa.thrift)
namespace java com.tv189.uc.thriftnamespace cpp thrift.vdbnamespace rb thrift.vdbnamespace perl thrift.vdbnamespace csharp thrift.vdbnamespace js thrift.vdbnamespace st thrift.vdbnamespace py thrift.vdbnamespace php thriftservice UCThriftService{ string ucOperator(1:string actionType, 2:string uid, 3:string data),}
2 生成java文件
thrift-0.6.0.exe -r --gen java uc.thriftthrift-0.6.0.exe -r --gen java uc.thriftthrift-0.6.0.exe -r --gen php uc.thriftthrift-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的一个异常。