Thrift第四課連接中斷異常處理-創(chuàng)新互聯(lián)

場景

創(chuàng)新互聯(lián)建站是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計,網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十多年品質(zhì),值得信賴!

Thrift框架采用了異常處理機(jī)制,當(dāng)客戶端異常斷開連接,服務(wù)端這個時候嘗試發(fā)送數(shù)據(jù)給客戶端,Thrift庫會拋出異常,導(dǎo)致進(jìn)程中斷。這種情況是非常正常的,服務(wù)器端應(yīng)該捕獲異常的發(fā)生,但是不應(yīng)該異常退出。

在用戶調(diào)用的線程進(jìn)行異常捕獲,這樣子不需要修改代碼

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意味著將達(dá)到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)? 線程在空閑的時候是如何進(jìn)行等待事件請求的
3)? pendingTaskCountMax_ 參數(shù)的具體含義是什么
4)isOpen函數(shù)其實只是確保了連接是否成功,如果連接成功之后,如果服務(wù)器斷開或者客戶端斷開連接,這個時候判斷isOpen函數(shù)的返回值是沒有任何的效果的,這個時候只能夠通過thrift自身的斷開連接的檢測機(jī)制,目前尚不了解會在什么時機(jī)釋放連接

其他的處理細(xì)節(jié)

1)繼承TServerEventHandler類,獲取連接用戶的基本信息包括IP和端口,從而監(jiān)控是否保存有沒有清除的連接
TServerEventHandler類提供了用戶連接和斷開的時候,針對套接字的處理方式,其中提供了兩個函數(shù)
createContext 當(dāng)一個新的用戶連接的時候會被調(diào)用
deleteContext 當(dāng)用戶結(jié)束請求處理的時候會被調(diào)用
?
詳細(xì)的流程可以查看TThreadPoolServer::Task,Task作為TThreadPoolServer的內(nèi)部類,在Task::run函數(shù)內(nèi)部,當(dāng)有連接進(jìn)來的時候,會獲取TServerEventHandler類的對象,判斷是否有實例化,對連接進(jìn)行處理,詳細(xì)的代碼??
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ù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

新聞名稱:Thrift第四課連接中斷異常處理-創(chuàng)新互聯(lián)
文章位置:http://muchs.cn/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)

成都做網(wǎng)站