关闭

Thrift开发教程

标签: stringexceptionserversocketjavaproperties
3495人阅读 评论(1) 收藏 举报
分类:

1 编写thrift文件(aa.thrift)

namespace java com.tv189.uc.thrift
namespace cppthrift.vdb
namespace rbthrift.vdb
namespace perlthrift.vdb
namespace csharpthrift.vdb
namespace jsthrift.vdb
namespace stthrift.vdb
namespace pythrift.vdb
namespace php thrift

serviceUCThriftService{
    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 phpuc.thrift
thrift-0.6.0.exe -r --gen pyuc.thrift
可以生成phppy等等的

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 staticvoid 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"));
		intclientTimeout = Integer.parseInt(PropertiesUtil.getValue(
				"tserver.properties", "ucserver.clientTimeout", "30000"));
		intminWorkerThreads = Integer.parseInt(PropertiesUtil.getValue(
				"tserver.properties", "ucserver.minWorkerThreads", "25"));
		intmaxWorkerThreads = 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.Argsarg = 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 staticvoid 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"));
		intclientTimeout = 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.Argsarg = 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"));
		intclientTimeout = Integer.parseInt(PropertiesUtil.getValue(
				"tserver.properties", "ucserver.clientTimeout", "30000"));
		intminWorkerThreads = 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.Argsarg = 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 voidnewThread() throws TException {
	String address = "0.0.0.0";
	int port = 5555;
	intclientTimeout = 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的一个异常。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:443271次
    • 积分:4221
    • 等级:
    • 排名:第7208名
    • 原创:46篇
    • 转载:100篇
    • 译文:4篇
    • 评论:33条
    最新评论