Thrift实例1
功能描述:客户端与服务器端分别是两个应用,先启动服务器端,再启动客户端,实现执行客户端运行服务器端的加法方法。
源码截图(源码在附件中):
客户端:
TestThriftClientServlet:
SendRequestController:
Pom.xml:
服务端:
TestThriftServlet:
ThriftServerController:
IThriftServer:由thrift工具编译生成
ThriftServerServiceImpl:
运行说明:先运行服务端TestThriftServlet,再运行客户端TestThriftClientServlet,观察控制台打印出81,即:77+5=81
Thrift实例2
1、业务逻辑描述:一个系统通过用户身份证号获取另一个系统里有关这个用户的积分。
2、首先编写脚本文件test.thrift:
命名空间:
namespace java com.test
namespace是关键字表示命名空间,也就是java的包,java表示脚本转换成java类
请求:identitycard是身份证号
struct UserRequest { 1:string identitycard }
返回:code是成功标识 0表示成功;integral是用户拥有的积分
Params是返回的参数集合这里只用一个字段积分(integral)做例子;
struct UserResponse { 1:string code 2:map<string,string> params }
服务:
service ThriftCase { UserResponse integralService(1: UserRequest request) }
3、到thrift官网下载
下载:thrift-0.6.1.tar.gz和Thrift compiler for Windows (thrift-0.6.1.exe)
4、用eclips里面的ant工具把thrift-0.6.1编译出jar包
解压:thrift-0.6.1.tar.gz
把解压后的文件夹放到eclipse的某个工程下如图:
如上图thrift-0.6.1文件夹放在名字是thrift的java工程的src下,有红叉不必管他,然后进入到thrift-0.6.1/lib/java中,右键点击build.xml
如图点击Ant Build。在build.xml同路径下会产生一个build文件夹里面有生成的thrift-0.6.1.jar包。把这个包放到所做的工程的lib里就行了。
5、把thrift脚本编译成java类
把thrift-0.6.1.exe和test.thrift文件放在同一个目录下并把路径写进环境变量Path中,如:E:/soft/ccc/路径下放入上述两个文件并把路径写进环境变量Path中。
在运行中键入cmd打开dos界面,进到E:/soft/ccc/路径下,执行thrift-0.6.1.exe文件,命令如下:
E:\soft\ccc\>Thrift-0.6.1 –gen java text.thrift
在这个目录下会产生一个gen-java文件夹,文件夹中会产生相应的java类,
ThriftCase.java
UserRequest.java
UserResponse.java
将三个文件拷贝到thrift工程的src/com/test/ 路径下。
6、编写服务端代码
服务端代码包含两个类:一个是业务逻辑类,一个是socket服务类。
业务逻辑类要实现ThriftCase.Iface服务接口
package com.test; import java.util.HashMap; import java.util.Map; public class ThriftCaseImpl implements ThriftCase.Iface{ public UserResponse integralService(UserRequest request) { try{ UserResponse urp=new UserResponse(); if(request.identitycard.equals("32010619881231103X")){ urp.setCode("0"); Map params=new HashMap(); params.put("integral", "10"); urp.setParams(params); } System.out.print("接收参数是:identitycard="+request.identitycard); return urp; }catch(Exception e){ e.printStackTrace(); } return null; } }
Socket服务类
package com.test; 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; public class TestService { private void start(){ try { TServerSocket serverTransport = new TServerSocket(8899); ThriftCase.Processor processor = new ThriftCase.Processor(new ThriftCaseImpl()); //TBinaryProtocol – 二进制编码格式进行数据传输。 Factory protFactory = new TBinaryProtocol.Factory(true,true); //TCompactProtocol 这种协议非常有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩 //Factory protFactory = new TCompactProtocol.Factory(); Args args = new Args(serverTransport); args.processor(processor); args.protocolFactory(protFactory); TServer server = new TThreadPoolServer(args); System.out.println("Starting server on port 8899 ..."); server.serve(); } catch (TTransportException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { // TODO Auto-generated method stub TestService srv = new TestService(); srv.start(); } }
7、客户端代码
package com.test; 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.TTransport; import org.apache.thrift.transport.TTransportException; import com.test.ThriftCase.Client; public class TestClient { private void start() { TTransport transport; try { transport = new TSocket("localhost", 8899); TProtocol protocol = new TBinaryProtocol(transport); Client client = new Client(protocol); UserRequest request=new UserRequest(); request.setIdentitycard("32010619881231103X"); transport.open(); com.test.UserResponse urp=client.integralService(request); if(urp.code!=null&&!urp.code.equals("")){ System.out.println("返回代码:"+urp.code+"; 参数是:"+urp.params.get("integral")); } transport.close(); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } } public static void main(String[] args) { TestClient c = new TestClient(); c.start(); } }
8、先开启服务
public static void main(String[] args) { // TODO Auto-generated method stub TestService srv = new TestService(); srv.start(); } 控制台显示: Starting server on port 8899 ...
9、再运行客户端
public static void main(String[] args) { TestClient c = new TestClient(); c.start(); }
控制台显示:
返回代码:0; 参数是:10
10、所需第三方包
log4j-1.2.15,
slf4j-api-1.6.1.jar
slf4j-log4j12-1.5.8.jar
原文链接:http://blog.tingyun.com/web/article/detail/1082