Thrift入门及Java实例演示
Posted OkidoGreen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thrift入门及Java实例演示相关的知识,希望对你有一定的参考价值。
目录:
- 概述
- 下载配置
- 基本概念
- 数据类型
- 服务端编码基本步骤
- 客户端编码基本步骤
- 数据传输协议
- 实例演示(java)
- thrift生成代码
- 实现接口Iface
- TSimpleServer服务模型
- TThreadPoolServer 服务模型
- TNonblockingServer 服务模型
- THsHaServer服务模型
- 异步客户端
[一]、概述
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
推荐值得一看的文章:
- http://jnb.ociweb.com/jnb/jnbJun2009.html
- http://wiki.apache.org/thrift
- http://thrift.apache.org/static/files/thrift-20070401.pdf
[二]、下载配置
到官网下载最新版本,截止今日(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基础知识详解