我遇到了这个异常并且它没有任何特定的消息,例如“读取超时”,“连接拒绝”或“连接重置”。并且通常不会发生此异常。
我想知道这个例外的根本原因是什么?
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)
答案 0 :(得分:1)
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()
中等待接收响应)。
最可能的原因是服务器端出现了一些未被捕获的错误。想到的另一个可能的来源可能是协议/传输堆栈不匹配。