TTransportException без какого-либо конкретного сообщения - PullRequest
0 голосов
/ 31 мая 2018

Я получил это исключение, и у него нет особых сообщений, таких как «тайм-аут чтения,« отказ в соединении »или« сброс соединения ». И это исключение обычно не происходит.

Интересно, чтоявляется основной причиной этого исключения?

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 (TFramed101) в 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 голосов
/ 05 июня 2018

Соответствующая строка в коде говорит

 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()).

Наиболее вероятная причина - некоторая необработанная ошибка на стороне сервера.Еще одним возможным источником, который приходит на ум, может быть несоответствие стеков протокола / транспорта.

...