1. 程式人生 > >Thrift第六課 連接中斷無法正常清理工作線程

Thrift第六課 連接中斷無法正常清理工作線程

open run 保存 hand 機制 read delete space rift

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