From 52ca7313923b41d62b10ea40509fb93f2a238644 Mon Sep 17 00:00:00 2001 From: ziyuexiachu <771730766@qq.com> Date: Wed, 26 Feb 2025 11:32:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dhttp=20api=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=AD=BB=E9=94=81=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/WebApi.cpp | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/server/WebApi.cpp b/server/WebApi.cpp index d825cafa..1916ed06 100755 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -293,22 +293,24 @@ static inline void addHttpListener(){ }; ((HttpSession::HttpResponseInvoker &) invoker) = newInvoker; } - - try { - it->second(parser, invoker, sender); - } catch (ApiRetException &ex) { - responseApi(ex.code(), ex.what(), invoker); - auto helper = static_cast(sender).shared_from_this(); - helper->getPoller()->async([helper, ex]() { helper->shutdown(SockException(Err_shutdown, ex.what())); }, false); - } + auto helper = static_cast(sender).shared_from_this(); + // 在本poller线程下一次事件循环时执行http api,防止占用NoticeCenter的锁 + helper->getPoller()->async([it, parser, invoker, helper]() { + try { + it->second(parser, invoker, *helper); + } catch (ApiRetException &ex) { + responseApi(ex.code(), ex.what(), invoker); + helper->getPoller()->async([helper, ex]() { helper->shutdown(SockException(Err_shutdown, ex.what())); }, false); + } #ifdef ENABLE_MYSQL - catch(SqlException &ex){ - responseApi(API::SqlFailed, StrPrinter << "操作数据库失败:" << ex.what() << ":" << ex.getSql(), invoker); - } -#endif// ENABLE_MYSQL - catch (std::exception &ex) { - responseApi(API::Exception, ex.what(), invoker); - } + catch (SqlException &ex) { + responseApi(API::SqlFailed, StrPrinter << "操作数据库失败:" << ex.what() << ":" << ex.getSql(), invoker); + } +#endif // ENABLE_MYSQL + catch (std::exception &ex) { + responseApi(API::Exception, ex.what(), invoker); + } + },false); }); }