zoukankan      html  css  js  c++  java
  • Thrift-java实例

    更多技术干货请戳:听云博客

    Thrift实例1

    功能描述:客户端与服务器端分别是两个应用,先启动服务器端,再启动客户端,实现执行客户端运行服务器端的加法方法。

    源码截图(源码在附件中):

    客户端:

    TestThriftClientServlet:

    2.png

    SendRequestController:

    3.png

    Pom.xml:

    4.png

    服务端:

    TestThriftServlet:

    2.png

    ThriftServerController:

    3.png

    IThriftServer:由thrift工具编译生成

    4.png

      ThriftServerServiceImpl:

    5.png

    运行说明:先运行服务端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官网下载

    http://thrift.apache.org/

    下载: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的某个工程下如图:

    2.png

    如上图thrift-0.6.1文件夹放在名字是thrift的java工程的src下,有红叉不必管他,然后进入到thrift-0.6.1/lib/java中,右键点击build.xml

    3.png

    如图点击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:softccc>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

  • 相关阅读:
    Lucene学习总结之一:全文检索的基本原理
    Solr学习和总结(线下1)
    HBase学习系列
    Hadoop家族系列文章
    SQL on Hadoop系统的最新进展(1)
    【转】redis数据库入门教程(全面详细)+面试问题
    Redis(1.3)Redis的基本特性(事务、多数据库)
    (5.15)mysql高可用系列——mysql mha实践
    Redis(1.2)Redis的数据结构与基本操作
    mysql函数使用报错
  • 原文地址:https://www.cnblogs.com/TingyunAPM/p/5719385.html
Copyright © 2011-2022 走看看