場景
Thrift框架采用了異常處理機制,當(dāng)客戶端異常斷開連接,服務(wù)端這個時候嘗試發(fā)送數(shù)據(jù)給客戶端,Thrift庫會拋出異常,導(dǎo)致進程中斷。這種情況是非常正常的,服務(wù)器端應(yīng)該捕獲異常的發(fā)生,但是不應(yīng)該異常退出。
在用戶調(diào)用的線程進行異常捕獲,這樣子不需要修改代碼
catch (const TTransportException& ttx)
{
//Thrift框架拋出的所有異常都會直接返回
std::cout<<ttx.what()<<std::endl;
return;
}
catch (const TException& ttx)
{
//Thrift框架拋出的所有異常都會直接返回
std::cout<<ttx.what()<<std::endl;
return;
}
分析一下服務(wù)器發(fā)送數(shù)據(jù)的函數(shù)
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拋出異常,代表當(dāng)前發(fā)送超時。while循環(huán)是為了循環(huán)發(fā)送,因為一次不一定發(fā)送完用戶數(shù)據(jù),畢竟MTU的限制。注意sent是一個無符號整型,當(dāng)b返回-1的時候,sent==0-1意味著將達到32位整數(shù)大值,大于len,從而直接退出循環(huán)。因為套接字已經(jīng)中斷,所以發(fā)送失敗,在調(diào)用write_partial函數(shù)的時候,返回b ==-1,導(dǎo)致退出循環(huán),從而避免了拋出異常,因此返回-1,是非常合理的值
問題
1)? 客戶端沒有調(diào)用close接口,關(guān)閉連接,服務(wù)器端只有唯一的一次closesocket代碼,輸出的字符串是\x1,目前暫時不知道在什么地方關(guān)閉套接字
2)? 線程在空閑的時候是如何進行等待事件請求的
3)? pendingTaskCountMax_ 參數(shù)的具體含義是什么
4)isOpen函數(shù)其實只是確保了連接是否成功,如果連接成功之后,如果服務(wù)器斷開或者客戶端斷開連接,這個時候判斷isOpen函數(shù)的返回值是沒有任何的效果的,這個時候只能夠通過thrift自身的斷開連接的檢測機制,目前尚不了解會在什么時機釋放連接
其他的處理細節(jié)
1)繼承TServerEventHandler類,獲取連接用戶的基本信息包括IP和端口,從而監(jiān)控是否保存有沒有清除的連接
TServerEventHandler類提供了用戶連接和斷開的時候,針對套接字的處理方式,其中提供了兩個函數(shù)
createContext 當(dāng)一個新的用戶連接的時候會被調(diào)用
deleteContext 當(dāng)用戶結(jié)束請求處理的時候會被調(diào)用
?
詳細的流程可以查看TThreadPoolServer::Task,Task作為TThreadPoolServer的內(nèi)部類,在Task::run函數(shù)內(nèi)部,當(dāng)有連接進來的時候,會獲取TServerEventHandler類的對象,判斷是否有實例化,對連接進行處理,詳細的代碼??
boost::shared_ptr<TServerEventHandler>eventHandler =
?server_.getEventHandler();
??
void* connectionContext = NULL;
if (eventHandler != NULL)
{????
?connectionContext =eventHandler->createContext(input_, output_);
}
?
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
新聞名稱:Thrift第四課連接中斷異常處理-創(chuàng)新互聯(lián)
文章位置:http://chinadenli.net/article26/djjdcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、商城網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)站策劃、Google、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)