【问题标题】:TTransportException Exception while working with Apache Thrift使用 Apache Thrift 时出现 TTransportException 异常
【发布时间】:2014-11-03 07:13:37
【问题描述】:

我正在使用 apache Thrift。我收到 TTransportException 异常,而我的代码看起来一切正常。这是我的 Thrift 服务器代码:

private TNonblockingServerSocket socket;
/**
 * @breif Store processor instance.
 */
private PringService.Processor processor;
/**
 * Store server instance.
 */
private TServer tServer;
/**
 *
 * @breif A handle to the unique Singleton instance.
 */
static private ThriftServer _instance = null;

/**
 * @breif The unique instance of this class.
 * @throws TTransportException
 */
static public ThriftServer getInstance() throws TTransportException {
    if (null == _instance) {
        _instance = new ThriftServer();
    }
    return _instance;
}

/**
 * @breif A Ctor for ThriftServer. Initialize all members.
 * @throws TTransportException
 */
private ThriftServer() throws TTransportException {
    socket = new TNonblockingServerSocket(Config.THRIFT_PORT);
    processor = new PringService.Processor(new Handler());
    THsHaServer.Args args = new THsHaServer.Args(socket);
    args.processor(processor);
    args.transportFactory(new TFramedTransport.Factory());
    args.inputProtocolFactory(new TBinaryProtocol.Factory());
    args.outputProtocolFactory(new TBinaryProtocol.Factory());
    tServer = new THsHaServer(args);
    /*tServer = new THsHaServer(processor, socket,
     new TFramedTransport.Factory(),
     new TFramedTransport.Factory(),
     new TBinaryProtocol.Factory(),
     new TBinaryProtocol.Factory());*/
}

/**
 * @breif main method
 * @param args the command line arguments
 * @throws TTransportException
 */
public static void main(String[] args) throws TTransportException {
    // To Run it directly from PringCore.jar, else use SmsProcessor Helper functionality
    ThriftServer server = new ThriftServer();
    server.execute(args);
}

@Override
/**
 * @breif Starts the execution.
 */
protected void execute(String[] args) {
    if (db != null) {
        db.close();
    }
    tServer.serve();
}

私有静态类 Handler 实现 PringService.Iface { …… } }

这是我的节俭客户:

    TTransport transport;
  try {
     transport = new TSocket("localhost", Config.THRIFT_PORT);        
     transport.open();

     TProtocol protocol = new TBinaryProtocol(transport);
     PringService.Client client = new PringService.Client(protocol);

     String result = client.importPringer(2558456, true);

    System.out.println("Result String is ::"+result);
     transport.close();
  } catch (TTransportException e) {
     e.printStackTrace();
  } catch (TException e) {
     e.printStackTrace();
  }

当我运行我的 Thrift 服务器然后运行 ​​thrift 客户端时,我得到以下异常:

org.apache.thrift.transport.TTransportException
at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132)
at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)
at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:378)
at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:297)
at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:204)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:69)

我是否在我的节俭服务器或客户端上使用了不匹配的传输套接字/层?还是有其他问题?

提前感谢您的指导:)

【问题讨论】:

    标签: java sockets thrift transport


    【解决方案1】:

    当您使用TNonblockingServerSocket 时,您需要在服务器端和客户端都使用TFramedTransportTNonblockingServerSocketdocumentation 对此非常明确:

    要使用此服务器,您必须在最外层传输处使用 TFramedTransport,否则此服务器将无法确定何时已从网络中读取整个方法调用。客户端也必须使用 TFramedTransport。

    因此,您的客户应如下所示:

    TTransport transport;
    
    try {
        transport = new TSocket("localhost", Config.THRIFT_PORT);        
        transport.open();
    
        TProtocol protocol = new TBinaryProtocol(new TFramedTransport(transport));
        PringService.Client client = new PringService.Client(protocol);
    
        String result = client.importPringer(2558456, true);
    
        System.out.println("Result String is ::"+result);
        transport.close();
    } catch (TTransportException e) {
        e.printStackTrace();
    } catch (TException e) {
        e.printStackTrace();
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多