重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
场景
创新互联建站是网站建设技术企业,为成都企业提供专业的成都网站建设、网站设计,网站设计,网站制作,网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制适合企业的网站。十多年品质,值得信赖!Thrift框架采用了异常处理机制,当客户端异常断开连接,服务端这个时候尝试发送数据给客户端,Thrift库会抛出异常,导致进程中断。这种情况是非常正常的,服务器端应该捕获异常的发生,但是不应该异常退出。
在用户调用的线程进行异常捕获,这样子不需要修改代码
catch (const TTransportException& ttx)
{
//Thrift框架抛出的所有异常都会直接返回
std::cout< return; } catch (const TException& ttx) { //Thrift框架抛出的所有异常都会直接返回 std::cout< return; } 分析一下服务器发送数据的函数 void TSocket::write(const uint8_t* buf, uint32_t len) { uint32_t sent = 0; while (sent < len) { uint32_t b = write_partial(buf + sent, len - sent); if (b == 0) { // This should only happen if the timeout set with SO_SNDTIMEO expired. // Raise an exception. throw TTransportException(TTransportException::TIMED_OUT, "send timeout expired"); } sent += b; } } 但b==0抛出异常,代表当前发送超时。while循环是为了循环发送,因为一次不一定发送完用户数据,毕竟MTU的限制。注意sent是一个无符号整型,当b返回-1的时候,sent==0-1意味着将达到32位整数大值,大于len,从而直接退出循环。因为套接字已经中断,所以发送失败,在调用write_partial函数的时候,返回b ==-1,导致退出循环,从而避免了抛出异常,因此返回-1,是非常合理的值 问题 其他的处理细节 1)继承TServerEventHandler类,获取连接用户的基本信息包括IP和端口,从而监控是否保存有没有清除的连接 另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
1) 客户端没有调用close接口,关闭连接,服务器端只有唯一的一次closesocket代码,输出的字符串是\x1,目前暂时不知道在什么地方关闭套接字
2) 线程在空闲的时候是如何进行等待事件请求的
3) pendingTaskCountMax_ 参数的具体含义是什么
4)isOpen函数其实只是确保了连接是否成功,如果连接成功之后,如果服务器断开或者客户端断开连接,这个时候判断isOpen函数的返回值是没有任何的效果的,这个时候只能够通过thrift自身的断开连接的检测机制,目前尚不了解会在什么时机释放连接
TServerEventHandler类提供了用户连接和断开的时候,针对套接字的处理方式,其中提供了两个函数
createContext 当一个新的用户连接的时候会被调用
deleteContext 当用户结束请求处理的时候会被调用
详细的流程可以查看TThreadPoolServer::Task,Task作为TThreadPoolServer的内部类,在Task::run函数内部,当有连接进来的时候,会获取TServerEventHandler类的对象,判断是否有实例化,对连接进行处理,详细的代码
boost::shared_ptr
server_.getEventHandler();
void* connectionContext = NULL;
if (eventHandler != NULL)
{
connectionContext =eventHandler->createContext(input_, output_);
}
当前文章:Thrift第四课连接中断异常处理-创新互联
文章链接:http://cqcxhl.cn/article/djjdcg.html