ServantHandle.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. /**
  2. * Tencent is pleased to support the open source community by making Tars available.
  3. *
  4. * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
  5. *
  6. * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
  7. * in compliance with the License. You may obtain a copy of the License at
  8. *
  9. * https://opensource.org/licenses/BSD-3-Clause
  10. *
  11. * Unless required by applicable law or agreed to in writing, software distributed
  12. * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  13. * CONDITIONS OF ANY KIND, either express or implied. See the License for the
  14. * specific language governing permissions and limitations under the License.
  15. */
  16. #include "util/tc_thread_pool.h"
  17. #include "util/tc_timeprovider.h"
  18. #include "servant/ServantHandle.h"
  19. #include "servant/Application.h"
  20. #include "servant/ServantHelper.h"
  21. #include "servant/AppProtocol.h"
  22. #include "servant/BaseF.h"
  23. #include "servant/KeepAliveNodeF.h"
  24. #include "servant/Cookie.h"
  25. #include "servant/Application.h"
  26. #include "servant/KeepAliveNodeF.h"
  27. // #ifdef TARS_OPENTRACKING
  28. // #include "servant/text_map_carrier.h"
  29. // #endif
  30. namespace tars
  31. {
  32. /////////////////////////////////////////////////////////////////////////
  33. //
  34. ServantHandle::ServantHandle(Application *application)
  35. : _application(application)
  36. {
  37. }
  38. ServantHandle::~ServantHandle()
  39. {
  40. {
  41. try
  42. {
  43. if(_servant)
  44. {
  45. _servant->destroy();
  46. }
  47. }
  48. catch(exception &ex)
  49. {
  50. TLOGERROR("[ServantHandle::destroy error:" << ex.what() << "]" << endl);
  51. }
  52. catch(...)
  53. {
  54. TLOGERROR("[ServantHandle::destroy unknown exception error]" << endl);
  55. }
  56. }
  57. }
  58. void ServantHandle::handleAsyncResponse()
  59. {
  60. ReqMessagePtr resp;
  61. while (_servant->getResponseQueue().pop_front(resp))
  62. {
  63. try
  64. {
  65. if (resp->response->iRet == TARSSERVERSUCCESS)
  66. {
  67. _servant->doResponse(resp);
  68. }
  69. else if (resp->pObjectProxy == NULL)
  70. {
  71. _servant->doResponseNoRequest(resp);
  72. }
  73. else
  74. {
  75. _servant->doResponseException(resp);
  76. }
  77. }
  78. catch (exception& e)
  79. {
  80. TLOGERROR("[ServantHandle::doResponse ex:" << e.what() << "]" << endl);
  81. }
  82. catch (...)
  83. {
  84. TLOGERROR("[ServantHandle::doResponse error]" << endl);
  85. }
  86. }
  87. //业务处理附加的自有消息
  88. try
  89. {
  90. _servant->doCustomMessage(false);
  91. _servant->doCustomMessage();
  92. }
  93. catch (exception& e)
  94. {
  95. TLOGERROR("[ServantHandle::doCustemMessage ex:" << e.what() << "]" << endl);
  96. }
  97. catch (...)
  98. {
  99. TLOGERROR("[ServantHandle::doCustemMessage ex.]" << endl);
  100. }
  101. }
  102. void ServantHandle::handleCustomMessage(bool bExpectIdle)
  103. {
  104. {
  105. //业务处理附加的自有消息
  106. try
  107. {
  108. _servant->doCustomMessage(bExpectIdle);
  109. _servant->doCustomMessage();
  110. }
  111. catch (exception& e)
  112. {
  113. TLOGERROR("[ServantHandle::doCustemMessage ex:" << e.what() << "]" << endl);
  114. }
  115. catch (...)
  116. {
  117. TLOGERROR("[ServantHandle::doCustemMessage ex.]" << endl);
  118. }
  119. }
  120. }
  121. bool ServantHandle::allFilterIsEmpty()
  122. {
  123. {
  124. if (!_servant->getResponseQueue().empty())
  125. {
  126. return false;
  127. }
  128. }
  129. return true;
  130. }
  131. void ServantHandle::initialize()
  132. {
  133. if(TC_CoroutineScheduler::scheduler())
  134. {
  135. ServantProxyThreadData::getData()->_sched = TC_CoroutineScheduler::scheduler();
  136. }
  137. _servant = _application->getServantHelper()->create(_bindAdapter->getName());
  138. if (!_servant)
  139. {
  140. if(_application->applicationConfig().checkBindAdapter)
  141. {
  142. TLOGERROR("[ServantHandle initialize createServant ret null, for adapter `" + _bindAdapter->getName() + "`]"
  143. << endl);
  144. cerr << "ServantHandle initialize createServant ret null, for adapter `" + _bindAdapter->getName() + "`]"
  145. << endl;
  146. RemoteNotify::getInstance()->report(
  147. "initialize createServant error: no adapter:" + _bindAdapter->getName());
  148. TC_Common::msleep(100);
  149. exit(-1);
  150. }
  151. else
  152. {
  153. return;
  154. }
  155. }
  156. try
  157. {
  158. _servant->setHandle(this);
  159. _servant->initialize();
  160. TLOGTARS("[" << _servant->getName() << " initialize]" << endl);
  161. }
  162. catch(exception &ex)
  163. {
  164. TLOGERROR("[initialize error:" << ex.what() << "]" << endl);
  165. RemoteNotify::getInstance()->report("initialize error:" + string(ex.what()));
  166. TC_Common::msleep(100);
  167. exit(-1);
  168. }
  169. catch(...)
  170. {
  171. TLOGERROR("[initialize unknown exception error]" << endl);
  172. RemoteNotify::getInstance()->report("initialize unknown exception error");
  173. TC_Common::msleep(100);
  174. exit(-1);
  175. }
  176. }
  177. void ServantHandle::heartbeat()
  178. {
  179. time_t fcur = TNOW;
  180. if (abs(fcur - _bindAdapter->getHeartBeatTime()) > HEART_BEAT_INTERVAL)
  181. {
  182. _bindAdapter->setHeartBeatTime(fcur);
  183. this->_application->getNodeHelper()->keepAlive(_bindAdapter->getName());
  184. // TARS_KEEPALIVE(_bindAdapter->getName());
  185. //上报连接数 比率
  186. if (_bindAdapter->_pReportConRate)
  187. {
  188. _bindAdapter->_pReportConRate->report((int)(_bindAdapter->getNowConnection() * 1000 / _bindAdapter->getMaxConns()));
  189. }
  190. //有队列, 且队列长度>0才上报
  191. if (_bindAdapter->_pReportQueue)
  192. {
  193. _bindAdapter->_pReportQueue->report((int)_bindAdapter->getRecvBufferSize());
  194. }
  195. }
  196. }
  197. CurrentPtr ServantHandle::createCurrent(const shared_ptr<TC_EpollServer::RecvContext> &data)
  198. {
  199. CurrentPtr current = new Current(this);
  200. try
  201. {
  202. current->initialize(data);
  203. }
  204. catch (TarsDecodeException &ex)
  205. {
  206. TLOGERROR("[ServantHandle::handle request protocol decode error:" << ex.what() << "]" << endl);
  207. close(data);
  208. return NULL;
  209. }
  210. //只有TARS协议才处理
  211. if(current->getBindAdapter()->isTarsProtocol())
  212. {
  213. int64_t now = TNOWMS;
  214. //数据在队列中的时间超过了客户端等待的时间(TARS协议)
  215. if (current->_request.iTimeout > 0 && (now - data->recvTimeStamp()) > current->_request.iTimeout)
  216. {
  217. //上报超时数目
  218. if (data->adapter()->_pReportTimeoutNum)
  219. data->adapter()->_pReportTimeoutNum->report(1);
  220. TLOGERROR("[TARS][ServantHandle::handle queue timeout:"
  221. << current->_request.sServantName << ", func:"
  222. << current->_request.sFuncName << ", recv time:"
  223. << data->recvTimeStamp() << ", queue timeout:"
  224. << data->adapter()->getQueueTimeout() << ", timeout:"
  225. << current->_request.iTimeout << ", now:"
  226. << now << ", ip:" << data->ip() << ", port:" << data->port() << "]" << endl);
  227. current->sendResponse(TARSSERVERQUEUETIMEOUT);
  228. return NULL;
  229. }
  230. }
  231. return current;
  232. }
  233. CurrentPtr ServantHandle::createCloseCurrent(const shared_ptr<TC_EpollServer::RecvContext> &data)
  234. {
  235. CurrentPtr current = new Current(this);
  236. current->initializeClose(data);
  237. current->setReportStat(false);
  238. current->setCloseType(data->closeType());
  239. return current;
  240. }
  241. void ServantHandle::handleClose(const shared_ptr<TC_EpollServer::RecvContext> &data)
  242. {
  243. TLOGTARS("[ServantHandle::handleClose,adapter:" << data->adapter()->getName() << ",peer:" << data->ip() << ":" << data->port() << "]"<< endl);
  244. CurrentPtr current = createCloseCurrent(data);
  245. try
  246. {
  247. //业务逻辑处理
  248. _servant->doClose(current);
  249. }
  250. catch (exception& ex)
  251. {
  252. TLOGERROR("[TARS]ServantHandle::handleClose " << ex.what() << endl);
  253. return;
  254. }
  255. catch (...)
  256. {
  257. TLOGERROR("[TARS]ServantHandle::handleClose unknown error" << endl);
  258. return;
  259. }
  260. }
  261. void ServantHandle::handleTimeout(const shared_ptr<TC_EpollServer::RecvContext> &data)
  262. {
  263. CurrentPtr current = createCurrent(data);
  264. if (!current) return;
  265. //上报超时数目
  266. if(data->adapter()->_pReportTimeoutNum)
  267. data->adapter()->_pReportTimeoutNum->report(1);
  268. TLOGERROR("[ServantHandle::handleTimeout adapter '"
  269. << data->adapter()->getName()
  270. << "', recvtime:" << data->recvTimeStamp() << "|"
  271. << ", timeout:" << data->adapter()->getQueueTimeout()
  272. << ", id:" << current->getRequestId() << "]" << endl);
  273. if (current->getBindAdapter()->isTarsProtocol())
  274. {
  275. current->sendResponse(TARSSERVERQUEUETIMEOUT);
  276. }
  277. }
  278. void ServantHandle::handleOverload(const shared_ptr<TC_EpollServer::RecvContext> &data)
  279. {
  280. CurrentPtr current = createCurrent(data);
  281. if (!current) return;
  282. TLOGERROR("[ServantHandle::handleOverload adapter '"
  283. << data->adapter()->getName()
  284. << "',overload:-1,queue capacity:"
  285. << data->adapter()->getQueueCapacity()
  286. << ",id:" << current->getRequestId() << "]" << endl);
  287. if (current->getBindAdapter()->isTarsProtocol())
  288. {
  289. current->sendResponse(TARSSERVEROVERLOAD);
  290. }
  291. }
  292. void ServantHandle::handle(const shared_ptr<TC_EpollServer::RecvContext> &data)
  293. {
  294. CurrentPtr current = createCurrent(data);
  295. if (!current) return;
  296. if (current->getBindAdapter()->isTarsProtocol())
  297. {
  298. handleTarsProtocol(current);
  299. }
  300. else
  301. {
  302. handleNoTarsProtocol(current);
  303. }
  304. }
  305. // #ifdef TARS_OPENTRACKING
  306. // void ServantHandle::processTracking(const TarsCurrentPtr &current)
  307. // {
  308. // if(!(Application::getCommunicator()->_traceManager))
  309. // {
  310. // return;
  311. // }
  312. // ServantProxyThreadData * sptd = ServantProxyThreadData::getData();
  313. // assert(sptd);
  314. // if(!sptd)
  315. // {
  316. // return;
  317. // }
  318. // //提取packet中的span信息,更新为被调的span信息后设置到sptd->_trackInfoMap;
  319. // sptd->_trackInfoMap.clear();
  320. // if (IS_MSG_TYPE(current->getMessageType(), tars::TARSMESSAGETYPETRACK))
  321. // {
  322. // map<string, string>::const_iterator trackinfoIter = current->getRequestStatus().find(ServantProxy::STATUS_TRACK_KEY);
  323. // TLOGTARS("[TARS] servant got a tracking request, message_type set" << current->getMessageType() << endl);
  324. // if (trackinfoIter != current->getRequestStatus().end())
  325. // {
  326. // TLOGTARS("[TARS] servant got a tracking request, tracking key:" << trackinfoIter->second << endl);
  327. // string context = trackinfoIter->second;
  328. // char szBuffer[context.size() + 1];
  329. // memset(szBuffer, 0x00, context.size() + 1);
  330. // memcpy(szBuffer, context.c_str(), context.size());
  331. // std::unordered_map<std::string, std::string> text_map;
  332. // write_span_context(text_map, szBuffer);
  333. // TextMapCarrier carrier(text_map);
  334. // auto tracer = Application::getCommunicator()->_traceManager->_tracer;
  335. // auto span_context_maybe = tracer->Extract(carrier);
  336. // if(!span_context_maybe)
  337. // {
  338. // //error
  339. // TLOGERROR("[TARS] servant got a tracking request, but extract the span context fail");
  340. // return ;
  341. // }
  342. // string funcName = current->getFuncName();
  343. // auto child_span = tracer->StartSpan(funcName, {opentracing::ChildOf(span_context_maybe->get())});
  344. // //text_map.clear();
  345. // auto err = tracer->Inject(child_span->context(), carrier);
  346. // assert(err);
  347. // sptd->_trackInfoMap = text_map;
  348. // _spanMap[current->getRequestId()].reset(child_span.release());
  349. // return ;
  350. // }
  351. // }
  352. // return ;
  353. // }
  354. // void ServantHandle::finishTracking(int ret, const TarsCurrentPtr &current)
  355. // {
  356. // int requestId = current->getRequestId();
  357. // if(_spanMap.find(requestId) != _spanMap.end())
  358. // {
  359. // auto spanIter = _spanMap.find(requestId);
  360. // spanIter->second->SetTag("Retcode", ret);
  361. // spanIter->second->Finish();
  362. // _spanMap.erase(requestId);
  363. // }
  364. // }
  365. // #endif
  366. bool ServantHandle::processDye(const CurrentPtr &current, string& dyeingKey)
  367. {
  368. //当前线程的线程数据
  369. ServantProxyThreadData *sptd = ServantProxyThreadData::getData();
  370. if (sptd)
  371. {
  372. sptd->_data._dyeingKey = "";
  373. }
  374. //当前请求已经被染色, 需要打印染色日志
  375. map<string, string>::const_iterator dyeingIt = current->getRequestStatus().find(ServantProxy::STATUS_DYED_KEY);
  376. if (IS_MSG_TYPE(current->getMessageType(), tars::TARSMESSAGETYPEDYED))
  377. {
  378. TLOGTARS("[servant got a dyeing request, message_type set: " << current->getMessageType() << "]" << endl);
  379. if (dyeingIt != current->getRequestStatus().end())
  380. {
  381. TLOGTARS("[servant got a dyeing request, dyeing key: " << dyeingIt->second << "]" << endl);
  382. dyeingKey = dyeingIt->second;
  383. }
  384. return true;
  385. }
  386. //servant已经被染色, 开启染色日志
  387. if (_application->getServantHelper()->isDyeing())
  388. {
  389. map<string, string>::const_iterator dyeingKeyIt = current->getRequestStatus().find(ServantProxy::STATUS_GRID_KEY);
  390. if (dyeingKeyIt != current->getRequestStatus().end() &&
  391. _application->getServantHelper()->isDyeingReq(dyeingKeyIt->second, current->getServantName(), current->getFuncName()))
  392. {
  393. TLOGTARS("[TARS] dyeing servant got a dyeing req, key:" << dyeingKeyIt->second << endl);
  394. dyeingKey = dyeingKeyIt->second;
  395. return true;
  396. }
  397. }
  398. return false;
  399. }
  400. bool ServantHandle::processTrace(const CurrentPtr &current)
  401. {
  402. //当前线程的线程数据
  403. ServantProxyThreadData* sptd = ServantProxyThreadData::getData();
  404. if (sptd)
  405. {
  406. sptd->_traceCall = false;
  407. sptd->_traceContext.reset();
  408. }
  409. // 如果调用链需要追踪,需要初始化线程私有追踪参数
  410. map<string, string>::const_iterator traceIt = current->getRequestStatus().find(ServantProxy::STATUS_TRACE_KEY);
  411. if (IS_MSG_TYPE(current->getMessageType(), tars::TARSMESSAGETYPETRACE))
  412. {
  413. TLOGTARS("[TARS] servant got a trace request, message_type set " << current->getMessageType() << endl);
  414. if (traceIt != current->getRequestStatus().end())
  415. {
  416. TLOGTARS("[TARS] servant got a trace request, trace key:" << traceIt->second << endl);
  417. if (sptd->initTrace(traceIt->second))
  418. {
  419. sptd->_traceCall = true;
  420. return true;
  421. }
  422. else
  423. {
  424. TLOGTARS("[TARS] servant got a trace request, but trace key is error:" << traceIt->second << endl);
  425. }
  426. }
  427. }
  428. return false;
  429. }
  430. bool ServantHandle::processCookie(const CurrentPtr &current, map<string, string> &cookie)
  431. {
  432. const static string STATUS = "STATUS_";
  433. std::for_each(current->getRequestStatus().begin(), current->getRequestStatus().end(),[&](const map<string, string>::value_type& p){
  434. if(p.first.size() > STATUS.size() && TC_Port::strncasecmp(p.first.c_str(), STATUS.c_str(), STATUS.size()) == 0) {
  435. return;
  436. }
  437. cookie.insert(make_pair(p.first, p.second));
  438. });
  439. return !cookie.empty();
  440. }
  441. bool ServantHandle::checkValidSetInvoke(const CurrentPtr &current)
  442. {
  443. /*是否允许检查合法性*/
  444. if (_application->applicationConfig().isCheckSet == 0)
  445. {
  446. //不检查
  447. return true;
  448. }
  449. auto clientConfig = _application->getThisCommunicator()->clientConfig();
  450. bool isSetInvoke = IS_MSG_TYPE(current->getMessageType(), tars::TARSMESSAGETYPESETNAME);
  451. //客户端按set规则调用且服务端启用set
  452. if (isSetInvoke && clientConfig.SetOpen)
  453. {
  454. /**
  455. * 合法性规则:
  456. * 1 客户端set名称与服务端set在同一分组,eg, test.s.1 <-> test.s.1
  457. * 2 客户端set名称与服务端set在同一地区,eg, test.s.* <-> test.s.1 | test.s.2 | test.s.*
  458. * 3 客户端set名称与服务端set属于不同名称,eg,test1.s.1 <->test2.n.2
  459. * 4 1,2,3条件都不满足,则认为该调用不合法
  460. */
  461. map<string, string>::const_iterator setIt = current->getRequestStatus().find(ServantProxy::STATUS_SETNAME_VALUE);
  462. string sSetName("");
  463. if (setIt != current->getRequestStatus().end())
  464. {
  465. TLOGTARS("[servant got a setname request, setname key:" << setIt->second << "]" << endl);
  466. sSetName = setIt->second;
  467. if (clientConfig.SetDivision == sSetName)
  468. {
  469. return true;
  470. }
  471. else
  472. {
  473. //属于同一地区是也属于合法调用
  474. string setArea1 = clientConfig.SetDivision.substr(0, clientConfig.SetDivision.find_last_of("."));
  475. string setArea2 = sSetName.substr(0,sSetName.find_last_of("."));
  476. if (setArea1 == setArea2)
  477. {
  478. return true;
  479. }
  480. else if (clientConfig.SetDivision.substr(0, clientConfig.SetDivision.find_first_of(".")) !=
  481. sSetName.substr(0,sSetName.find_first_of(".")))
  482. {
  483. //属于不同的set之间调用也属于合法
  484. return true;
  485. }
  486. else
  487. {
  488. TLOGERROR("[ServantHandle::checkValidSetInvoke|"
  489. << current->getIp() << "|"
  490. << current->getMessageType() << "|"
  491. << current->getServantName() << "|"
  492. << current->getFuncName() << "|client:"
  493. << clientConfig.SetDivision << "|server:"
  494. << sSetName << "]" << endl);
  495. current->sendResponse(TARSINVOKEBYINVALIDESET);
  496. return false;
  497. }
  498. }
  499. }
  500. else
  501. {
  502. TLOGERROR("[ServantHandle::checkValidSetInvoke|"
  503. << current->getIp() << "|"
  504. << current->getMessageType() << "|"
  505. << current->getServantName() << "|"
  506. << current->getFuncName() << "|client:"
  507. << clientConfig.SetDivision << "|server:"
  508. << sSetName << "]" << endl);
  509. current->sendResponse(TARSINVOKEBYINVALIDESET);
  510. return false;
  511. }
  512. }
  513. //没有按set规则调用
  514. return true;
  515. }
  516. void ServantHandle::handleTarsProtocol(const CurrentPtr &current)
  517. {
  518. TLOGTARS("[ServantHandle::handleTarsProtocol servant:" << _servant->getName()
  519. << ", ip: " << current->getIp() << ":" << current->getPort()
  520. << ", message: " << current->getMessageType()
  521. << ", servant: " << current->getServantName()
  522. << ", func:" << current->getFuncName()
  523. << ", requestId: " << current->getRequestId()
  524. << ", status:" << TC_Common::tostr(current->getRequestStatus()) << "]"<<endl);
  525. //检查set调用合法性
  526. if (!checkValidSetInvoke(current))
  527. {
  528. return;
  529. }
  530. //处理染色消息
  531. string dyeingKey = "";
  532. TarsDyeingSwitch dyeSwitch;
  533. if (processDye(current, dyeingKey))
  534. {
  535. dyeSwitch.enableDyeing(dyeingKey);
  536. }
  537. processTrace(current);
  538. //处理cookie
  539. map<string, string> cookie;
  540. CookieOp cookieOp;
  541. if (processCookie(current, cookie))
  542. {
  543. cookieOp.setCookie(cookie);
  544. current->setCookie(cookie);
  545. }
  546. ResponsePacket response;
  547. try
  548. {
  549. if (_servant->getName() != current->getServantName())
  550. {
  551. response.iRet = _servant->doNoServant(current, response.sBuffer);
  552. }
  553. else
  554. {
  555. //业务逻辑处理
  556. response.iRet = _servant->dispatch(current, response.sBuffer);
  557. }
  558. }
  559. catch (TarsDecodeException& ex)
  560. {
  561. TLOGERROR("[ServantHandle::handleTarsProtocol " << _servant->getName() << ", error:" << ex.what() << "]" << endl);
  562. response.iRet = TARSSERVERDECODEERR;
  563. response.sResultDesc = ex.what();
  564. }
  565. catch (TarsEncodeException& ex)
  566. {
  567. TLOGERROR("[ServantHandle::handleTarsProtocol " << _servant->getName() << ", error:" << ex.what() << "]" << endl);
  568. response.iRet = TARSSERVERENCODEERR;
  569. response.sResultDesc = ex.what();
  570. }
  571. catch (exception& ex)
  572. {
  573. TLOGERROR("[ServantHandle::handleTarsProtocol " << _servant->getName() << ", error:" << ex.what() << "]" << endl);
  574. response.iRet = TARSSERVERUNKNOWNERR;
  575. response.sResultDesc = ex.what();
  576. }
  577. catch (...)
  578. {
  579. TLOGERROR("[ServantHandle::handleTarsProtocol " << _servant->getName() << ", unknown error]"<< endl);
  580. response.iRet = TARSSERVERUNKNOWNERR;
  581. response.sResultDesc = "handleTarsProtocol unknown exception error";
  582. }
  583. if (response.iRet == TARSSERVERNOFUNCERR)
  584. {
  585. response.iRet = _servant->doNoFunc(current, response.sBuffer);
  586. }
  587. //单向调用或者业务不需要同步返回
  588. if (current->isResponse())
  589. {
  590. current->sendResponse(response);
  591. }
  592. //#ifdef TARS_OPENTRACKING
  593. // finishTracking(ret, current);
  594. //#endif
  595. }
  596. void ServantHandle::handleNoTarsProtocol(const TarsCurrentPtr &current)
  597. {
  598. TLOGTARS("[ServantHandle::handleNoTarsProtocol current:"
  599. << current->getIp() << "|"
  600. << current->getPort() << "|"
  601. << current->getServantName() << "]" << endl);
  602. vector<char> buffer;
  603. try
  604. {
  605. //业务逻辑处理
  606. _servant->dispatch(current, buffer);
  607. }
  608. catch(exception &ex)
  609. {
  610. TLOGERROR("[ServantHandle::handleNoTarsProtocol " << ex.what() << "]" << endl);
  611. }
  612. catch(...)
  613. {
  614. TLOGERROR("[ServantHandle::handleNoTarsProtocol unknown error]" << endl);
  615. }
  616. if (current->isResponse() && !buffer.empty())
  617. {
  618. current->sendResponse((const char *)(buffer.data()), (uint32_t)buffer.size());
  619. }
  620. }
  621. ////////////////////////////////////////////////////////////////////////////
  622. }