Thrift第六课 连接中断无法正常清理工作线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thrift第六课 连接中断无法正常清理工作线程相关的知识,希望对你有一定的参考价值。

1)继承TServerEventHandler类,获取连接用户的基本信息包括IP和端口,从而监控是否保存有没有清除的连接

TServerEventHandler类提供了用户连接和断开的时候,针对套接字的处理方式,其中提供了两个函数

createContext 当一个新的用户连接的时候会被调用

deleteContext 当用户结束请求处理的时候会被调用

 

详细的流程可以查看TThreadPoolServer::Task,Task作为TThreadPoolServer的内部类,在Task::run函数内部,当有连接进来的时候,会获取TServerEventHandler类的对象,判断是否有实例化,对连接进行处理,详细的代码   

boost::shared_ptr<TServerEventHandler>eventHandler =

 server_.getEventHandler();

   

void* connectionContext = NULL;

if (eventHandler != NULL) 

{     

connectionContext =eventHandler->createContext(input_, output_);

}

 

参考

http://blog.csdn.net/hbuxiaoshe/article/details/38942869


2)在实际的应用中,创建一定数量的工作线程为用户连接服务,发现用户异常中断之后,工作线程无法正常析构,导致耗尽线程池的工作线程


问题

1)  客户端没有调用close接口,关闭连接,服务器端只有唯一的一次closesocket代码,输出的字符串是\x1,目前暂时不知道在什么地方关闭套接字

2)  线程在空闲的时候是如何进行等待事件请求的

3)  pendingTaskCountMax_ 参数的具体含义是什么

4)isOpen函数其实只是确保了连接是否成功,如果连接成功之后,如果服务器断开或者客户端断开连接,这个时候判断isOpen函数的返回值是没有任何的效果的,这个时候只能够通过thrift自身的断开连接的检测机制,目前尚不了解会在什么时机释放连接


以上是关于Thrift第六课 连接中断无法正常清理工作线程的主要内容,如果未能解决你的问题,请参考以下文章

Thrift第四课 连接中断异常处理

RabbitMQ第六课 例子说明

django第六课 模型第一讲

Android第六课 安装异常处理

微搭低代码零基础入门课(第六课)

PHP走进 PHP 第六课 MySQL