没有任何特定消息的TTransportException

时间:2018-05-31 08:37:01

标签: java thrift

我遇到了这个异常并且它没有任何特定的消息,例如“读取超时”,“连接拒绝”或“连接重置”。并且通常不会发生此异常。

我想知道这个例外的根本原因是什么?

  

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

1 个答案:

答案 0 :(得分:1)

relevant line in the code

 if (bytesRead < 0) { 
    throw new TTransportException(TTransportException.END_OF_FILE); 
 } 

调用者无法从底层传输中读取len个字节,这通常意味着远程端挂起(关闭连接):

/** 
 * Reads from the underlying input stream if not null. 
 */ 
public int read(byte[] buf, int off, int len) throws TTransportException 
{ 
    if (inputStream_ == null) { 
        throw new TTransportException(TTransportException.NOT_OPEN, "Cannot read from null inputStream"); 
    } 
    int bytesRead; 
    try { 
        bytesRead = inputStream_.read(buf, off, len); 
    } catch (IOException iox) { 
        throw new TTransportException(TTransportException.UNKNOWN, iox); 
    } 
   if (bytesRead < 0) { 
       throw new TTransportException(TTransportException.END_OF_FILE); 
    } 
    return bytesRead; 
} 

对于服务器,并且您没有遇到任何表明问题的问题,特定的问题就是Thrift的工作方式。

对于客户端,如您的示例所示,它似乎表明服务器过早地关闭了连接(客户端在TServiceClient.receiveBase()中等待接收响应)。

最可能的原因是服务器端出现了一些未被捕获的错误。想到的另一个可能的来源可能是协议/传输堆栈不匹配。

相关问题