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自身的斷開連接的檢測機制,目前尚不瞭解會在什麼時機釋放連接


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章