最近发现数据服务日志大量报出thrift异常,抛出TTransportException,定位到thrift源代码thrift/server/TThreadPoolServer.h中,发现代码作者是这样写的。
if (!processor_->process(input_, output_, connectionContext) || !input_->getTransport()->peek()) { break; } } } catch (const TTransportException&) { // This is reasonably expected, client didn't send a full request so just // ignore him // string errStr = string("TThreadPoolServer client died: ") }
是因为client发出的请求不完全,thrift的框架会自动将thrift接口文件中的方法,例如test()接口,在它生成的service文件中是这样子的:
void test()
{
send_test();
recv_test();
}
void send_test();
void recv_test();
这三个接口client都可以使用,所以client可能调用了send_test()接口后,直接关闭了transport(反正没有调用recv_test()),通过这样的方式来实现异步。
就像作者代码里面写的一样:just ignore him!