Thrift入门及Java实例演示

Posted OkidoGreen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thrift入门及Java实例演示相关的知识,希望对你有一定的参考价值。

目录:

  • 概述
  • 下载配置
  • 基本概念
    1. 数据类型
    2. 服务端编码基本步骤
    3. 客户端编码基本步骤
    4. 数据传输协议
  • 实例演示(java)
    1.  thrift生成代码
    2.  实现接口Iface
    3. TSimpleServer服务模型
    4. TThreadPoolServer 服务模型
    5. TNonblockingServer 服务模型
    6. THsHaServer服务模型
    7. 异步客户端

[一]、概述

Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, php, Ruby, Erlang, Perl, Haskell, C#, Cocoa, javascript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。

Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

官网地址:thrift.apache.org

推荐值得一看的文章:

[二]、下载配置

到官网下载最新版本,截止今日(2012-06-11)最新版本为0.8.0.

1. 如果是Maven构建项目的,直接在pom.xml 中添加如下内容:

<dependency>
  <groupId>org.apache.thrift</groupId>
  <artifactId>libthrift</artifactId>
  <version>0.8.0</version>
</dependency>

2.如果自己编译lib包,把下载的压缩包解压到X:盘,然后在X:\\thrift-0.8.0\\lib\\java 目录下运行ant进行自动编译,会在X:\\thrift-0.8.0\\lib\\java\\build\\ 目录下看到编译好的lib包:libthrift-0.8.0.jar

[三]、基本概念

1.数据类型

  • 基本类型:
    • bool:布尔值,true 或 false,对应 Java 的 boolean
    • byte:8 位有符号整数,对应 Java 的 byte
    • i16:16 位有符号整数,对应 Java 的 short
    • i32:32 位有符号整数,对应 Java 的 int
    • i64:64 位有符号整数,对应 Java 的 long
    • double:64 位浮点数,对应 Java 的 double
    • string:utf-8编码的字符串,对应 Java 的 String
  • 结构体类型:
    • struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
  • 容器类型:
    • list:对应 Java 的 ArrayList
    • set:对应 Java 的 HashSet
    • map:对应 Java 的 HashMap
  • 异常类型:
    • exception:对应 Java 的 Exception
  • 服务类型:
    • service:对应服务的类

2.服务端编码基本步骤:

  • 实现服务处理接口impl
  • 创建TProcessor
  • 创建TServerTransport
  • 创建TProtocol
  • 创建TServer
  • 启动Server

3.客户端编码基本步骤:

  • 创建Transport
  • 创建TProtocol
  • 基于TTransport和TProtocol创建 Client
  • 调用Client的相应方法

4.数据传输协议

  • TBinaryProtocol : 二进制格式.
  • TCompactProtocol : 压缩格式
  • TJSONProtocol : JSON格式
  • TSimpleJSONProtocol : 提供JSON只写协议, 生成的文件很容易通过脚本语言解析

tips:客户端和服务端的协议要一致

[四]、实例演示

1. thrift生成代码

创建Thrift文件:G:\\test\\thrift\\demoHello.thrift ,内容如下:

namespace java com.micmiu.thrift.demo
service  HelloWorldService 
  string sayHello(1:string username)

目录结构如下:

G:\\test\\thrift>tree /F
卷 other 的文件夹 PATH 列表
卷序列号为 D238-BE47
G:.
    demoHello.thrift
    demouser.thrift
    thrift-0.8.0.exe

没有子文件夹

thrift-0.8.0.exe 是官网提供的windows下编译工具,运用这个工具生成相关代码:

thrift-0.8.0.exe -r -gen java ./demoHello.thrift

生成后的目录结构如下:

G:\\test\\thrift>tree /F
卷 other 的文件夹 PATH 列表
卷序列号为 D238-BE47
G:.
│  demoHello.thrift
│  demouser.thrift
│  thrift-0.8.0.exe
│
└─gen-java
    └─com
        └─micmiu
            └─thrift
                └─demo
                        HelloWorldService.java

HelloWorldService

/**
 * Autogenerated by Thrift Compiler (0.9.3)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
package com.micmiu.thrift.demo;

import org.apache.thrift.scheme.IScheme;
import org.apache.thrift.scheme.SchemeFactory;
import org.apache.thrift.scheme.StandardScheme;

import org.apache.thrift.scheme.TupleScheme;
import org.apache.thrift.protocol.TTupleProtocol;
import org.apache.thrift.protocol.TProtocolException;
import org.apache.thrift.EncodingUtils;
import org.apache.thrift.TException;
import org.apache.thrift.async.AsyncMethodCallback;
import org.apache.thrift.server.AbstractNonblockingServer.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.EnumMap;
import java.util.Set;
import java.util.HashSet;
import java.util.EnumSet;
import java.util.Collections;
import java.util.BitSet;
import java.nio.ByteBuffer;
import java.util.Arrays;
import javax.annotation.Generated;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SuppressWarnings("cast", "rawtypes", "serial", "unchecked")
@Generated(value = "Autogenerated by Thrift Compiler (0.9.3)", date = "2017-01-10")
public class HelloWorldService 

  public interface Iface 

    public String sayHello(String username) throws org.apache.thrift.TException;

  

  public interface AsyncIface 

    public void sayHello(String username, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;

  

  public static class Client extends org.apache.thrift.TServiceClient implements Iface 
    public static class Factory implements org.apache.thrift.TServiceClientFactory<Client> 
      public Factory() 
      public Client getClient(org.apache.thrift.protocol.TProtocol prot) 
        return new Client(prot);
      
      public Client getClient(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) 
        return new Client(iprot, oprot);
      
    

    public Client(org.apache.thrift.protocol.TProtocol prot)
    
      super(prot, prot);
    

    public Client(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) 
      super(iprot, oprot);
    

    public String sayHello(String username) throws org.apache.thrift.TException
    
      send_sayHello(username);
      return recv_sayHello();
    

    public void send_sayHello(String username) throws org.apache.thrift.TException
    
      sayHello_args args = new sayHello_args();
      args.setUsername(username);
      sendBase("sayHello", args);
    

    public String recv_sayHello() throws org.apache.thrift.TException
    
      sayHello_result result = new sayHello_result();
      receiveBase(result, "sayHello");
      if (result.isSetSuccess()) 
        return result.success;
      
      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "sayHello failed: unknown result");
    

  
  public static class AsyncClient extends org.apache.thrift.async.TAsyncClient implements AsyncIface 
    public static class Factory implements org.apache.thrift.async.TAsyncClientFactory<AsyncClient> 
      private org.apache.thrift.async.TAsyncClientManager clientManager;
      private org.apache.thrift.protocol.TProtocolFactory protocolFactory;
      public Factory(org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.protocol.TProtocolFactory protocolFactory) 
        this.clientManager = clientManager;
        this.protocolFactory = protocolFactory;
      
      public AsyncClient getAsyncClient(org.apache.thrift.transport.TNonblockingTransport transport) 
        return new AsyncClient(protocolFactory, clientManager, transport);
      
    

    public AsyncClient(org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.transport.TNonblockingTransport transport) 
      super(protocolFactory, clientManager, transport);
    

    public void sayHello(String username, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException 
      checkReady();
      sayHello_call method_call = new sayHello_call(username, resultHandler, this, ___protocolFactory, ___transport);
      this.___currentMethod = method_call;
      ___manager.call(method_call);
    

    public static class sayHello_call extends org.apache.thrift.async.TAsyncMethodCall 
      private String username;
      public sayHello_call(String username, org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException 
        super(client, protocolFactory, transport, resultHandler, false);
        this.username = username;
      

      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException 
        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("sayHello", org.apache.thrift.protocol.TMessageType.CALL, 0));
        sayHello_args args = new sayHello_args();
        args.setUsername(username);
        args.write(prot);
        prot.writeMessageEnd();
      

      public String getResult() throws org.apache.thrift.TException 
        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) 
          throw new IllegalStateException("Method call not finished!");
        
        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());
        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);
        return (new Client(prot)).recv_sayHello();
      
    

  

  public static class Processor<I extends Iface> extends org.apache.thrift.TBaseProcessor<I> implements org.apache.thrift.TProcessor 
    private static final Logger LOGGER = LoggerFactory.getLogger(Processor.class.getName());
    public Processor(I iface) 
      super(iface, getProcessMap(new HashMap<String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>>()));
    

    protected Processor(I iface, Map<String,  org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> processMap) 
      super(iface, getProcessMap(processMap));
    

    private static <I extends Iface> Map<String,  org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> getProcessMap(Map<String,  org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> processMap) 
      processMap.put("sayHello", new sayHello());
      return processMap;
    

    public static class sayHello<I extends Iface> extends org.apache.thrift.ProcessFunction<I, sayHello_args> 
      public sayHello() 
        super("sayHello");
      

      public sayHello_args getEmptyArgsInstance() 
        return new sayHello_args();
      

      protected boolean isOneway() 
        return false;
      

      public sayHello_result getResult(I iface, sayHello_args args) throws org.apache.thrift.TException 
        sayHello_result result = new sayHello_result();
        result.success = iface.sayHello(args.username);
        return result;
      
    

  

  public static class AsyncProcessor<I extends AsyncIface> extends org.apache.thrift.TBaseAsyncProcessor<I> 
    private static final Logger LOGGER = LoggerFactory.getLogger(AsyncProcessor.class.getName());
    public AsyncProcessor(I iface) 
      super(iface, getProcessMap(new HashMap<String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>>()));
    

    protected AsyncProcessor(I iface, Map<String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase, ?>> processMap) 
      super(iface, getProcessMap(processMap));
    

    private static <I extends AsyncIface> Map<String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase,?>> getProcessMap(Map<String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase, ?>> processMap) 
      processMap.put("sayHello", new sayHello());
      return processMap;
    

    public static class sayHello<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, sayHello_args, String> 
      public sayHello() 
        super("sayHello");
      

      public sayHello_args getEmptyArgsInstance() 
        return new sayHello_args();
      

      public AsyncMethodCallback<String> getResultHandler(final AsyncFrameBuffer fb, final int seqid) 
        final org.apache.thrift.AsyncProcessFunction fcall = this;
        return new AsyncMethodCallback<String>()  
          public void onComplete(String o) 
            sayHello_result result = new sayHello_result();
            result.success = o;
            try 
              fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);
              return;
             catch (Exception e) 
              LOGGER.error("Exception writing to internal frame buffer", e);
            
            fb.close();
          
          public void onError(Exception e) 
            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;
            org.apache.thrift.TBase msg;
            sayHello_result result = new sayHello_result();
            
              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;
              msg = (org.apache.thrift.TBase)new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());
            
            try 
              fcall.sendResponse(fb,msg,msgType,seqid);
              return;
             catch (Exception ex) 
              LOGGER.error("Exception writing to internal frame buffer", ex);
            
            fb.close();
          
        ;
      

      protected boolean isOneway() 
        return false;
      

      public void start(I iface, sayHello_args args, org.apache.thrift.async.AsyncMethodCallback<String> resultHandler) throws TException 
        iface.sayHello(args.username,resultHandler);
      
    

  

  public static class sayHello_args implements org.apache.thrift.TBase<sayHello_args, sayHello_args._Fields>, java.io.Serializable, Cloneable, Comparable<sayHello_args>   
    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("sayHello_args");

    private static final org.apache.thrift.protocol.TField USERNAME_FIELD_DESC = new org.apache.thrift.protocol.TField("username", org.apache.thrift.protocol.TType.STRING, (short)1);

    private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
    static 
      schemes.put(StandardScheme.class, new sayHello_argsStandardSchemeFactory());
      schemes.put(TupleScheme.class, new sayHello_argsTupleSchemeFactory());
    

    public String username; // required

    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
    public enum _Fields implements org.apache.thrift.TFieldIdEnum 
      USERNAME((short)1, "username");

      private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();

      static 
        for (_Fields field : EnumSet.allOf(_Fields.class)) 
          byName.put(field.getFieldName(), field);
        
      

      /**
       * Find the _Fields constant that matches fieldId, or null if its not found.
       */
      public static _Fields findByThriftId(int fieldId) 
        switch(fieldId) 
          case 1: // USERNAME
            return USERNAME;
          default:
            return null;
        
      

      /**
       * Find the _Fields constant that matches fieldId, throwing an exception
       * if it is not found.
       */
      public static _Fields findByThriftIdOrThrow(int fieldId) 
        _Fields fields = findByThriftId(fieldId);
        if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
        return fields;
      

      /**
       * Find the _Fields constant that matches name, or null if its not found.
       */
      public static _Fields findByName(String name) 
        return byName.get(name);
      

      private final short _thriftId;
      private final String _fieldName;

      _Fields(short thriftId, String fieldName) 
        _thriftId = thriftId;
        _fieldName = fieldName;
      

      public short getThriftFieldId() 
        return _thriftId;
      

      public String getFieldName() 
        return _fieldName;
      
    

    // isset id assignments
    public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
    static 
      Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
      tmpMap.put(_Fields.USERNAME, new org.apache.thrift.meta_data.FieldMetaData("username", org.apache.thrift.TFieldRequirementType.DEFAULT, 
          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
      metaDataMap = Collections.unmodifiableMap(tmpMap);
      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(sayHello_args.class, metaDataMap);
    

    public sayHello_args() 
    

    public sayHello_args(
      String username)
    
      this();
      this.username = username;
    

    /**
     * Performs a deep copy on <i>other</i>.
     */
    public sayHello_args(sayHello_args other) 
      if (other.isSetUsername()) 
        this.username = other.username;
      
    

    public sayHello_args deepCopy() 
      return new sayHello_args(this);
    

    @Override
    public void clear() 
      this.username = null;
    

    public String getUsername() 
      return this.username;
    

    public sayHello_args setUsername(String username) 
      this.username = username;
      return this;
    

    public void unsetUsername() 
      this.username = null;
    

    /** Returns true if field username is set (has been assigned a value) and false otherwise */
    public boolean isSetUsername() 
      return this.username != null;
    

    public void setUsernameIsSet(boolean value) 
      if (!value) 
        this.username = null;
      
    

    public void setFieldValue(_Fields field, Object value) 
      switch (field) 
      case USERNAME:
        if (value == null) 
          unsetUsername();
         else 
          setUsername((String)value);
        
        break;

      
    

    public Object getFieldValue(_Fields field) 
      switch (field) 
      case USERNAME:
        return getUsername();

      
      throw new IllegalStateException();
    

    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
    public boolean isSet(_Fields field) 
      if (field == null) 
        throw new IllegalArgumentException();
      

      switch (field) 
      case USERNAME:
        return isSetUsername();
      
      throw new IllegalStateException();
    

    @Override
    public boolean equals(Object that) 
      if (that == null)
        return false;
      if (that instanceof sayHello_args)
        return this.equals((sayHello_args)that);
      return false;
    

    public boolean equals(sayHello_args that) 
      if (that == null)
        return false;

      boolean this_present_username = true && this.isSetUsername();
      boolean that_present_username = true && that.isSetUsername();
      if (this_present_username || that_present_username) 
        if (!(this_present_username && that_present_username))
          return false;
        if (!this.username.equals(that.username))
          return false;
      

      return true;
    

    @Override
    public int hashCode() 
      List<Object> list = new ArrayList<Object>();

      boolean present_username = true && (isSetUsername());
      list.add(present_username);
      if (present_username)
        list.add(username);

      return list.hashCode();
    

    @Override
    public int compareTo(sayHello_args other) 
      if (!getClass().equals(other.getClass())) 
        return getClass().getName().compareTo(other.getClass().getName());
      

      int lastComparison = 0;

      lastComparison = Boolean.valueOf(isSetUsername()).compareTo(other.isSetUsername());
      if (lastComparison != 0) 
        return lastComparison;
      
      if (isSetUsername()) 
        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.username, other.username);
        if (lastComparison != 0) 
          return lastComparison;
        
      
      return 0;
    

    public _Fields fieldForId(int fieldId) 
      return _Fields.findByThriftId(fieldId);
    

    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException 
      schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
    

    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException 
      schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
    

    @Override
    public String toString() 
      StringBuilder sb = new StringBuilder("sayHello_args(");
      boolean first = true;

      sb.append("username:");
      if (this.username == null) 
        sb.append("null");
       else 
        sb.append(this.username);
      
      first = false;
      sb.append(")");
      return sb.toString();
    

    public void validate() throws org.apache.thrift.TException 
      // check for required fields
      // check for sub-struct validity
    

    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException 
      try 
        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TiostreamTransport(out)));
       catch (org.apache.thrift.TException te) 
        throw new java.io.IOException(te);
      
    

    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException 
      try 
        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
       catch (org.apache.thrift.TException te) 
        throw new java.io.IOException(te);
      
    

    private static class sayHello_argsStandardSchemeFactory implements SchemeFactory 
      public sayHello_argsStandardScheme getScheme() 
        return new sayHello_argsStandardScheme();
      
    

    private static class sayHello_argsStandardScheme extends StandardScheme<sayHello_args> 

      public void read(org.apache.thrift.protocol.TProtocol iprot, sayHello_args struct) throws org.apache.thrift.TException 
        org.apache.thrift.protocol.TField schemeField;
        iprot.readStructBegin();
        while (true)
        
          schemeField = iprot.readFieldBegin();
          if (schemeField.type == org.apache.thrift.protocol.TType.STOP)  
            break;
          
          switch (schemeField.id) 
            case 1: // USERNAME
              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) 
                struct.username = iprot.readString();
                struct.setUsernameIsSet(true);
               else  
                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
              
              break;
            default:
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
          
          iprot.readFieldEnd();
        
        iprot.readStructEnd();

        // check for required fields of primitive type, which can't be checked in the validate method
        struct.validate();
      

      public void write(org.apache.thrift.protocol.TProtocol oprot, sayHello_args struct) throws org.apache.thrift.TException 
        struct.validate();

        oprot.writeStructBegin(STRUCT_DESC);
        if (struct.username != null) 
          oprot.writeFieldBegin(USERNAME_FIELD_DESC);
          oprot.writeString(struct.username);
          oprot.writeFieldEnd();
        
        oprot.writeFieldStop();
        oprot.writeStructEnd();
      

    

    private static class sayHello_argsTupleSchemeFactory implements SchemeFactory 
      public sayHello_argsTupleScheme getScheme() 
        return new sayHello_argsTupleScheme();
      
    

    private static class sayHello_argsTupleScheme extends TupleScheme<sayHello_args> 

      @Override
      public void write(org.apache.thrift.protocol.TProtocol prot, sayHello_args struct) throws org.apache.thrift.TException 
        TTupleProtocol oprot = (TTupleProtocol) prot;
        BitSet optionals = new BitSet();
        if (struct.isSetUsername()) 
          optionals.set(0);
        
        oprot.writeBitSet(optionals, 1);
        if (struct.isSetUsername()) 
          oprot.writeString(struct.username);
        
      

      @Override
      public void read(org.apache.thrift.protocol.TProtocol prot, sayHello_args struct) throws org.apache.thrift.TException 
        TTupleProtocol iprot = (TTupleProtocol) prot;
        BitSet incoming = iprot.readBitSet(1);
        if (incoming.get(0)) 
          struct.username = iprot.readString();
          struct.setUsernameIsSet(true);
        
      
    

  

  public static class sayHello_result implements org.apache.thrift.TBase<sayHello_result, sayHello_result._Fields>, java.io.Serializable, Cloneable, Comparable<sayHello_result>   
    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("sayHello_result");

    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.STRING, (short)0);

    private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
    static 
      schemes.put(StandardScheme.class, new sayHello_resultStandardSchemeFactory());
      schemes.put(TupleScheme.class, new sayHello_resultTupleSchemeFactory());
    

    public String success; // required

    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
    public enum _Fields implements org.apache.thrift.TFieldIdEnum 
      SUCCESS((short)0, "success");

      private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();

      static 
        for (_Fields field : EnumSet.allOf(_Fields.class)) 
          byName.put(field.getFieldName(), field);
        
      

      /**
       * Find the _Fields constant that matches fieldId, or null if its not found.
       */
      public static _Fields findByThriftId(int fieldId) 
        switch(fieldId) 
          case 0: // SUCCESS
            return SUCCESS;
          default:
            return null;
        
      

      /**
       * Find the _Fields constant that matches fieldId, throwing an exception
       * if it is not found.
       */
      public static _Fields findByThriftIdOrThrow(int fieldId) 
        _Fields fields = findByThriftId(fieldId);
        if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
        return fields;
      

      /**
       * Find the _Fields constant that matches name, or null if its not found.
       */
      public static _Fields findByName(String name) 
        return byName.get(name);
      

      private final short _thriftId;
      private final String _fieldName;

      _Fields(short thriftId, String fieldName) 
        _thriftId = thriftId;
        _fieldName = fieldName;
      

      public short getThriftFieldId() 
        return _thriftId;
      

      public String getFieldName() 
        return _fieldName;
      
    

    // isset id assignments
    public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
    static 
      Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, 
          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
      metaDataMap = Collections.unmodifiableMap(tmpMap);
      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(sayHello_result.class, metaDataMap);
    

    public sayHello_result() 
    

    public sayHello_result(
      String success)
    
      this();
      this.success = success;
    

    /**
     * Performs a deep copy on <i>other</i>.
     */
    public sayHello_result(sayHello_result other) 
      if (other.isSetSuccess()) 
        this.success = other.success;
      
    

    public sayHello_result deepCopy() 
      return new sayHello_result(this);
    

    @Override
    public void clear() 
      this.success = null;
    

    public String getSuccess() 
      return this.success;
    

    public sayHello_result setSuccess(String success) 
      this.success = success;
      return this;
    

    public void unsetSuccess() 
      this.success = null;
    

    /** Returns true if field success is set (has been assigned a value) and false otherwise */
    public boolean isSetSuccess() 
      return this.success != null;
    

    public void setSuccessIsSet(boolean value) 
      if (!value) 
        this.success = null;
      
    

    public void setFieldValue(_Fields field, Object value) 
      switch (field) 
      case SUCCESS:
        if (value == null) 
          unsetSuccess();
         else 
          setSuccess((String)value);
        
        break;

      
    

    public Object getFieldValue(_Fields field) 
      switch (field) 
      case SUCCESS:
        return getSuccess();

      
      throw new IllegalStateException();
    

    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
    public boolean isSet(_Fields field) 
      if (field == null) 
        throw new IllegalArgumentException();
      

      switch (field) 
      case SUCCESS:
        return isSetSuccess();
      
      throw new IllegalStateException();
    

    @Override
    public boolean equals(Object that) 
      if (that == null)
        return false;
      if (that instanceof sayHello_result)
        return this.equals((sayHello_result)that);
      return false;
    

    public boolean equals(sayHello_result that) 
      if (that == null)
        return false;

      boolean this_present_success = true && this.isSetSuccess();
      boolean that_present_success = true && that.isSetSuccess();
      if (this_present_success || that_present_success) 
        if (!(this_present_success && that_present_success))
          return false;
        if (!this.success.equals(that.success))
          return false;
      

      return true;
    

    @Override
    public int hashCode() 
      List<Object> list = new ArrayList<Object>();

      boolean present_success = true && (isSetSuccess());
      list.add(present_success);
      if (present_success)
        list.add(success);

      return list.hashCode();
    

    @Override
    public int compareTo(sayHello_result other) 
      if (!getClass().equals(other.getClass())) 
        return getClass().getName().compareTo(other.getClass().getName());
      

      int lastComparison = 0;

      lastComparison = Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());
      if (lastComparison != 0) 
        return lastComparison;
      
      if (isSetSuccess()) 
        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);
        if (lastComparison != 0) 
          return lastComparison;
        
      
      return 0;
    

    public _Fields fieldForId(int fieldId) 
      return _Fields.findByThriftId(fieldId);
    

    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException 
      schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
    

    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException 
      schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
      

    @Override
    public String toString() 
      StringBuilder sb = new StringBuilder("sayHello_result(");
      boolean first = true;

      sb.append("success:");
      if (this.success == null) 
        sb.append("null");
       else 
        sb.append(this.success);
      
      first = false;
      sb.append(")");
      return sb.toString();
    

    public void validate() throws org.apache.thrift.TException 
      // check for required fields
      // check for sub-struct validity
    

    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException 
      try 
        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
       catch (org.apache.thrift.TException te) 
        throw new java.io.IOException(te);
      
    

    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException 
      try 
        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
       catch (org.apache.thrift.TException te) 
        throw new java.io.IOException(te);
      
    

    private static class sayHello_resultStandardSchemeFactory implements SchemeFactory 
      public sayHello_resultStandardScheme getScheme() 
        return new sayHello_resultStandardScheme();
      
    

    private static class sayHello_resultStandardScheme extends StandardScheme<sayHello_result> 

      public void read(org.apache.thrift.protocol.TProtocol iprot, sayHello_result struct) throws org.apache.thrift.TException 
        org.apache.thrift.protocol.TField schemeField;
        iprot.readStructBegin();
        while (true)
        
          schemeField = iprot.readFieldBegin();
          if (schemeField.type == org.apache.thrift.protocol.TType.STOP)  
            break;
          
          switch (schemeField.id) 
            case 0: // SUCCESS
              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) 
                struct.success = iprot.readString();
                struct.setSuccessIsSet(true);
               else  
                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
              
              break;
            default:
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
          
          iprot.readFieldEnd();
        
        iprot.readStructEnd();

        // check for required fields of primitive type, which can't be checked in the validate method
        struct.validate();
      

      public void write(org.apache.thrift.protocol.TProtocol oprot, sayHello_result struct) throws org.apache.thrift.TException 
        struct.validate();

        oprot.writeStructBegin(STRUCT_DESC);
        if (struct.success != null) 
          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
          oprot.writeString(struct.success);
          oprot.writeFieldEnd();
        
        oprot.writeFieldStop();
        oprot.writeStructEnd();
      

    

    private static class sayHello_resultTupleSchemeFactory implements SchemeFactory 
      public sayHello_resultTupleScheme getScheme() 
        return new sayHello_resultTupleScheme();
      
    

    private static class sayHello_resultTupleScheme extends TupleScheme<sayHello_result> 

      @Override
      public void write(org.apache.thrift.protocol.TProtocol prot, sayHello_result struct) throws org.apache.thrift.TException 
        TTupleProtocol oprot = (TTupleProtocol) prot;
        BitSet optionals = new BitSet();
        if (struct.isSetSuccess()) 
          optionals.set(0);
        
        oprot.writeBitSet(optionals, 1);
        if (struct.isSetSuccess()) 
          oprot.writeString(struct.success);
        
      

      @Override
      public void read(org.apache.thrift.protocol.TProtocol prot, sayHello_result struct) throws org.apache.thrift.TException 
        TTupleProtocol iprot = (TTupleProtocol) prot;
        BitSet incoming = iprot.readBitSet(1);
        if (incoming.get(0)) 
          struct.success = iprot.readString();
          struct.setSuccessIsSet(true);
        
      
    

  




将生成的HelloWorldService.java 文件copy到自己测试的工程中,我的工程是用maven构建的,故在pom.xml中增加如下内容:

<dependency>
	<groupId>org.apache.thrift</groupId>
	<artifactId>libthrift</artifactId>
	<version>0.8.0</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>1.5.8</version>
</dependency>

2. 实现接口Iface

java代码:HelloWorldImpl.java

package com.micmiu.thrift.demo;

import org.apache.thrift.TException;

/**
 * blog http://www.micmiu.com
 *
 * @author Michael
 *
 */
public class HelloWorldImpl implements HelloWorldService.Iface 

	public HelloWorldImpl() 
	

	@Override
	public String sayHello(String username) throws TException 
		return "Hi," + username + " welcome to my blog www.micmiu.com";
	

3.TSimpleServer服务端

简单的单线程服务模型,一般用于测试。

编写服务端server代码:HelloServerDemo.java

package com.micmiu.thrift.demo;

import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TJSONProtocol;
import org.apache.thrift.protocol.TSimpleJSONProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;

/**
 * blog http://www.micmiu.com
 *
 * @author Michael
 *
 */
public class HelloServerDemo 
	public static final int SERVER_PORT = 8090;

	public void startServer() 
		try 
			System.out.println("HelloWorld TSimpleServer start ....");

			TProcessor tprocessor = new HelloWorldService.Processor<HelloWorldService.Iface>(
					new HelloWorldImpl());
			// HelloWorldService.Processor<HelloWorldService.Iface> tprocessor =
			// new HelloWorldService.Processor<HelloWorldService.Iface>(
			// new HelloWorldImpl());

			// 简单的单线程服务模型,一般用于测试
			TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
			TServer.Args tArgs = new TServer.Args(serverTransport);
			tArgs.processor(tprocessor);
			tArgs.protocolFactory(new TBinaryProtocol.Factory());
			// tArgs.protocolFactory(new TCompactProtocol.Factory());
			// tArgs.protocolFactory(new TJSONProtocol.Factory());
			TServer server = new TSimpleServer(tArgs);
			server.serve();

		 catch (Exception e) 
			System.out.println("Server start error!!!");
			e.printStackTrace();
		
	

	/**
	 * @param args
	 */
	public static void main(String[] args) 
		HelloServerDemo server = new HelloServerDemo();
		server.startServer();
	

编写客户端Client代码:HelloClientDemo.java

package com.micmiu.thrift.demo;

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TJSONProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

/**
 * blog http://www.micmiu.com
 *
 * @author Michael
 *
 */
public class HelloClientDemo 

	public static final String SERVER_IP = "localhost";
	public static final int SERVER_PORT = 8090;
	public static final int TIMEOUT = 30000;

	/**
	 *
	 * @param userName
	 */
	public void startClient(String userName) 
		TTransport transport = null;
		try 
			transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);
			// 协议要和服务端一致
			TProtocol protocol = new TBinaryProtocol(transport);
			// TProtocol protocol = new TCompactProtocol(transport);
			// TProtocol protocol = new TJSONProtocol(transport);
			HelloWorldService.Client client = new HelloWorldService.Client(
					protocol);
			transport.open();
			String result = client.sayHello(userName);
			System.out.println("Thrify client result =: " + result);
		 catch (TTransportException e) 
			e.printStackTrace();
		 catch (TException e) 
			e.printStackTrace();
		 finally 
			if (null != transport) 
				transport.close();
			
		
	

	/**
	 * @param args
	 */
	public static void main(String[] args) 
		HelloClientDemo client = new HelloClientDemo();
		client.startClient("Michael");

	

先运行服务端程序,日志如下:

Thrift入门初探--thrift基础知识详解

Apache Thrift学习之二(基础及原理)

RPC远程协议之Thrift入门

Thrift入门

Java Remote Debug(idea远程调试)

Apache Thrift系列详解- 概述与入门