Thrift第六課 連接中斷無法正常清理工作線程
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第六課 連接中斷無法正常清理工作線程