你的位置:首页 > Java教程

[Java教程]thrift:swift项目笔记


先声明:此swift不是Apple公司的那个swift开发语言,而是facebook的另一个开源项目。

facebook的thrift IDL文件,如果默认用thrift -gen java生成java代码,代码十分冗长,大家可以先感受一下。
一、IDL文件

service HelloService{  string ping()}

二、thrift命令生成的HelloService.java

/** * Autogenerated by Thrift Compiler (0.9.3) * * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING * @generated */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 = "2016-03-22")public class HelloService { public interface Iface {  public String ping() throws org.apache.thrift.TException; } public interface AsyncIface {  public void ping(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 ping() throws org.apache.thrift.TException  {   send_ping();   return recv_ping();  }  public void send_ping() throws org.apache.thrift.TException  {   ping_args args = new ping_args();   sendBase("ping", args);  }  public String recv_ping() throws org.apache.thrift.TException  {   ping_result result = new ping_result();   receiveBase(result, "ping");   if (result.isSetSuccess()) {    return result.success;   }   throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "ping 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 ping(org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException {   checkReady();   ping_call method_call = new ping_call(resultHandler, this, ___protocolFactory, ___transport);   this.___currentMethod = method_call;   ___manager.call(method_call);  }  public static class ping_call extends org.apache.thrift.async.TAsyncMethodCall {   public ping_call(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);   }   public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {    prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("ping", org.apache.thrift.protocol.TMessageType.CALL, 0));    ping_args args = new ping_args();    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_ping();   }  } } 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("ping", new ping());   return processMap;  }  public static class ping<I extends Iface> extends org.apache.thrift.ProcessFunction<I, ping_args> {   public ping() {    super("ping");   }   public ping_args getEmptyArgsInstance() {    return new ping_args();   }   protected boolean isOneway() {    return false;   }   public ping_result getResult(I iface, ping_args args) throws org.apache.thrift.TException {    ping_result result = new ping_result();    result.success = iface.ping();    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("ping", new ping());   return processMap;  }  public static class ping<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, ping_args, String> {   public ping() {    super("ping");   }   public ping_args getEmptyArgsInstance() {    return new ping_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) {      ping_result result = new ping_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;      ping_result result = new ping_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, ping_args args, org.apache.thrift.async.AsyncMethodCallback<String> resultHandler) throws TException {    iface.ping(resultHandler);   }  } } public static class ping_args implements org.apache.thrift.TBase<ping_args, ping_args._Fields>, java.io.Serializable, Cloneable, Comparable<ping_args>  {  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ping_args");  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();  static {   schemes.put(StandardScheme.class, new ping_argsStandardSchemeFactory());   schemes.put(TupleScheme.class, new ping_argsTupleSchemeFactory());  }  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */  public enum _Fields implements org.apache.thrift.TFieldIdEnum {;   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) {     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;   }  }  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);   metaDataMap = Collections.unmodifiableMap(tmpMap);   org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ping_args.class, metaDataMap);  }  public ping_args() {  }  /**   * Performs a deep copy on <i>other</i>.   */  public ping_args(ping_args other) {  }  public ping_args deepCopy() {   return new ping_args(this);  }  @Override  public void clear() {  }  public void setFieldValue(_Fields field, Object value) {   switch (field) {   }  }  public Object getFieldValue(_Fields field) {   switch (field) {   }   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) {   }   throw new IllegalStateException();  }  @Override  public boolean equals(Object that) {   if (that == null)    return false;   if (that instanceof ping_args)    return this.equals((ping_args)that);   return false;  }  public boolean equals(ping_args that) {   if (that == null)    return false;   return true;  }  @Override  public int hashCode() {   List<Object> list = new ArrayList<Object>();   return list.hashCode();  }  @Override  public int compareTo(ping_args other) {   if (!getClass().equals(other.getClass())) {    return getClass().getName().compareTo(other.getClass().getName());   }   int lastComparison = 0;   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("ping_args(");   boolean first = true;   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 ping_argsStandardSchemeFactory implements SchemeFactory {   public ping_argsStandardScheme getScheme() {    return new ping_argsStandardScheme();   }  }  private static class ping_argsStandardScheme extends StandardScheme<ping_args> {   public void read(org.apache.thrift.protocol.TProtocol iprot, ping_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) {      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, ping_args struct) throws org.apache.thrift.TException {    struct.validate();    oprot.writeStructBegin(STRUCT_DESC);    oprot.writeFieldStop();    oprot.writeStructEnd();   }  }  private static class ping_argsTupleSchemeFactory implements SchemeFactory {   public ping_argsTupleScheme getScheme() {    return new ping_argsTupleScheme();   }  }  private static class ping_argsTupleScheme extends TupleScheme<ping_args> {   @Override   public void write(org.apache.thrift.protocol.TProtocol prot, ping_args struct) throws org.apache.thrift.TException {    TTupleProtocol oprot = (TTupleProtocol) prot;   }   @Override   public void read(org.apache.thrift.protocol.TProtocol prot, ping_args struct) throws org.apache.thrift.TException {    TTupleProtocol iprot = (TTupleProtocol) prot;   }  } } public static class ping_result implements org.apache.thrift.TBase<ping_result, ping_result._Fields>, java.io.Serializable, Cloneable, Comparable<ping_result>  {  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ping_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 ping_resultStandardSchemeFactory());   schemes.put(TupleScheme.class, new ping_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(ping_result.class, metaDataMap);  }  public ping_result() {  }  public ping_result(   String success)  {   this();   this.success = success;  }  /**   * Performs a deep copy on <i>other</i>.   */  public ping_result(ping_result other) {   if (other.isSetSuccess()) {    this.success = other.success;   }  }  public ping_result deepCopy() {   return new ping_result(this);  }  @Override  public void clear() {   this.success = null;  }  public String getSuccess() {   return this.success;  }  public ping_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 ping_result)    return this.equals((ping_result)that);   return false;  }  public boolean equals(ping_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(ping_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("ping_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 ping_resultStandardSchemeFactory implements SchemeFactory {   public ping_resultStandardScheme getScheme() {    return new ping_resultStandardScheme();   }  }  private static class ping_resultStandardScheme extends StandardScheme<ping_result> {   public void read(org.apache.thrift.protocol.TProtocol iprot, ping_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, ping_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 ping_resultTupleSchemeFactory implements SchemeFactory {   public ping_resultTupleScheme getScheme() {    return new ping_resultTupleScheme();   }  }  private static class ping_resultTupleScheme extends TupleScheme<ping_result> {   @Override   public void write(org.apache.thrift.protocol.TProtocol prot, ping_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, ping_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);    }   }  } }}

对于有代码洁癖的人来说,尝试阅读这一巨型java类是很别扭的。swift子项目正好解决了这个问题,它可以通过注解极大简化最终生成的thrift 服务java代码,大家可以对比一下:

三、swift生成的HelloService代码

package yjmyzz.cnblogs.com.thrift.swift;import com.facebook.swift.service.ThriftMethod;import com.facebook.swift.service.ThriftService;import com.google.common.util.concurrent.ListenableFuture;@ThriftService("HelloService")public interface HelloService{  @ThriftService("HelloService")  public interface Async  {    @ThriftMethod(value = "ping")    ListenableFuture<String> ping();  }  @ThriftMethod(value = "ping")  String ping() throws org.apache.thrift.TException;}

上面这段代码,可以用maven-plugin生成:

四、swift-maven-plugin 配置

 1 <plugins> 2   <plugin> 3     <groupId>com.facebook.mojo</groupId> 4     <artifactId>swift-maven-plugin</artifactId> 5     <version>${swift-version}</version> 6     <executions> 7       <execution> 8         <goals> 9           <goal>generate</goal>10         </goals>11       </execution>12     </executions>13     <configuration>14       <skip>false</skip>15       <idlFiles>16         <directory>${project.basedir}/src/main/thrift/</directory>17         <includes>18           <include>**/*.thrift</include>19         </includes>20         <!--<excludes>-->21           <!--<exclude>**/other.thrift</exclude>-->22         <!--</excludes>-->23       </idlFiles>24       <defaultPackage>${project.groupId}.thrift.swift</defaultPackage>25       <outputFolder>${project.basedir}/src/main/java/</outputFolder>26     </configuration>27   </plugin>28 </plugins>

View Code

五、服务端代码示例

为了方便,先封装一个服务启动的辅助类

package yjmyzz.cnblogs.com.thrift.server;import com.facebook.nifty.core.NettyServerConfig;import com.facebook.nifty.core.ThriftServerDef;import com.facebook.swift.codec.ThriftCodecManager;import com.facebook.swift.service.ThriftEventHandler;import com.facebook.swift.service.ThriftServer;import com.facebook.swift.service.ThriftServiceProcessor;import com.google.common.collect.ImmutableList;import org.junit.Assert;import yjmyzz.cnblogs.com.thrift.service.HelloServiceImpl;import java.util.concurrent.ExecutorService;import static java.util.concurrent.Executors.newCachedThreadPool;import static java.util.concurrent.Executors.newFixedThreadPool;/** * Created by yangjunming on 3/22/16. * author: yangjunming@huijiame.com */public class ServerCreator {  private ExecutorService taskWorkerExecutor;  private ThriftServer server;  private ExecutorService bossExecutor;  private ExecutorService ioWorkerExecutor;  public ThriftServer getServer() {    return server;  }  public ServerCreator invoke() {    ThriftServiceProcessor processor = new ThriftServiceProcessor(        new ThriftCodecManager(),        ImmutableList.<ThriftEventHandler>of(),        new HelloServiceImpl()    );    taskWorkerExecutor = newFixedThreadPool(1);    ThriftServerDef serverDef = ThriftServerDef.newBuilder()        .listen(12345)        .withProcessor(processor)        .using(taskWorkerExecutor)        .build();    bossExecutor = newCachedThreadPool();    ioWorkerExecutor = newCachedThreadPool();    NettyServerConfig serverConfig = NettyServerConfig.newBuilder()        .setBossThreadExecutor(bossExecutor)        .setWorkerThreadExecutor(ioWorkerExecutor)        .build();    server = new ThriftServer(serverConfig, serverDef);    return this;  }  public void checkExecutorsTerminated() {    Assert.assertTrue(bossExecutor.isTerminated());    Assert.assertTrue(ioWorkerExecutor.isTerminated());    Assert.assertTrue(taskWorkerExecutor.isTerminated());  }  public void stop() {    server.close();  }}

然后就可以直接用了:

package yjmyzz.cnblogs.com.thrift.server;import com.facebook.swift.service.ThriftServer;/** * Created by yangjunming on 3/22/16. * author: yangjunming@huijiame.com */public class ThriftServerDemo {  public static void main(String[] args) {    ServerCreator serverCreator = new ServerCreator().invoke();    ThriftServer server = serverCreator.getServer();    server.start();    System.out.println("服务已启动!");    //serverCreator.stop();    //serverCreator.checkExecutorsTerminated();  }}

六、客户端代码

package yjmyzz.cnblogs.com.thrift.client;import com.facebook.nifty.client.FramedClientConnector;import com.facebook.swift.service.ThriftClientManager;import org.apache.thrift.TException;import yjmyzz.cnblogs.com.thrift.swift.HelloService;import java.util.concurrent.ExecutionException;import static com.google.common.net.HostAndPort.fromParts;/** * Created by yangjunming on 3/22/16. * author: yangjunming@huijiame.com */public class ThriftClientDemo {  public static void main(String[] args) throws ExecutionException, InterruptedException, TException {    ThriftClientManager clientManager = new ThriftClientManager();    HelloService helloService = clientManager.createClient(        new FramedClientConnector(fromParts("localhost", 12345)),        HelloService.class).get();    System.out.println(helloService.ping());    int max = 100000;    Long start = System.currentTimeMillis();    for (int i = 0; i < max; i++) {      helloService.ping();    }    Long end = System.currentTimeMillis();    Long elapse = end - start;    int perform = Double.valueOf(max / (elapse / 1000d)).intValue();    System.out.print("thrift " + max + " 次RPC调用,耗时:" + elapse + "毫秒,平均" + perform + "次/秒");  }}

上面的代码,server/client是基于netty实现的,在我笔记上的结果大概1秒8k+次, 相对thrift原生成的实现,性能只有70%上下。