Thrift开发实例
准备工作
Thrift主页:http://thrift.apache.org/
Thrift下载:http://thrift.apache.org/download/
下载thrift-0.8.0.tar.gz和Thrift compiler for Windows (thrift-0.8.0.exe)
创建工作区../thrift;
将thrift-0.8.0.tar.gz和thrift-0.8.0.exe拷贝到../thrift下;
将thrift-0.8.0.tar.gz解压到当前目录;
创建start.bat,编辑其内容为:
cd thrift-0.8.0 --gen java *.thrift pause |
简单实例
创建thrift脚本文件:
namespace java com.test.rpc service TestService{ string getUserName(1:i64 id) } |
执行start.bat,thrift会根据脚本生成java代码../thrift/gen-java/com/test/rpc/ TestService.java;
创建java project;
创建package:com.test.rpc,将生成的TestService.java拷入;
创建接口实现类TestImpl
package com.test.rpc;
import org.apache.log4j.Logger; import org.apache.thrift.TException;
import com.test.rpc.TestService.Iface; import com.test.user.IUserService; import com.test.user.UserServiceImpl;
public class TestImpl implements Iface { private static final Logger LOG = Logger.getLogger(TestImpl.class);
@Override public String getUserName(long id) throws TException { LOG.info("TestImpl server get rpc msg :"+id); IUserService userService = new UserServiceImpl(); String username = userService.getUser(id); return username; }
} |
创建RPC server启动线程
package com.test.rpc;
import javax.xml.ws.Endpoint;
import org.apache.log4j.Logger; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TBinaryProtocol.Factory; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadPoolServer; import org.apache.thrift.server.TThreadPoolServer.Args; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TTransportException;
import com.test.service.CommonService;
public class TestServer extends Thread { private static final Logger LOG = Logger.getLogger(TestServer.class);
@Override public void run() { try { TestImpl testimpl = new TestImpl(); TServerSocket serverTransport = new TServerSocket(7911); Factory proFactory = new TBinaryProtocol.Factory(); TProcessor processor = new TestService.Processor<TestImpl>(testimpl); Args rpcArgs = new Args(serverTransport); rpcArgs.processor(processor); rpcArgs.protocolFactory(proFactory); TServer server = new TThreadPoolServer(rpcArgs); LOG.info("Start TestService on port 7911..." + Thread.currentThread().getId() + "[" + Thread.currentThread().getName() + "]"); server.serve(); } catch (TTransportException e) { e.printStackTrace(); LOG.info("TestService.simpleRun", e); } } /** * @param args */ public static void main(String[] args) { TestServer server = new TestServer(); server.start(); }
} |
复杂对象实例
与简单实例基本相同,只是脚本不同,参数以对象方式传递,自动生成的java类多一些;
创建thrift脚本文件:
namespace java com.test.rpc struct User { 1: i64 id 2: string name } service TestService{ User getUser(1:i64 id) } |
执行start.bat,thrift会根据脚本生成java代码../thrift/gen-java/com/test/rpc/目录下TestService.java、User.Java;
创建java project;
创建package:com.test.rpc,将生成的TestService.java、User.Java拷入;
其他步骤类同上例;
客户端代码
package com.test.rpc;
import org.apache.log4j.Logger; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransportException; import com.test.rpc.TestService.Client;
public class TestClient { private static final Logger LOG = Logger.getLogger(TestClient.class);
public static void main(String[] args){ try{ TSocket tsocket = new TSocket("localhost", 7911); tsocket.open(); TProtocol protocol = new TBinaryProtocol(tsocket); Client client = new Client(protocol); User user = client.getUser(id); LOG.info(user.getName()); }catch (Exception e) { LOG.error(e.getMessage(), e); } }
} |