Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

run_as_daemon 之后无法发送http请求 #2250

Open
yqmm666 opened this issue Feb 6, 2025 · 5 comments
Open

run_as_daemon 之后无法发送http请求 #2250

yqmm666 opened this issue Feb 6, 2025 · 5 comments

Comments

@yqmm666
Copy link

yqmm666 commented Feb 6, 2025

前台运行时候正常可以发送httpclient请求(异步)
run_as_daemon切到后台后,无法正确发送。
查看trace的log 发现move to queue之后没有got a new task

@an-tao
Copy link
Member

an-tao commented Feb 6, 2025

你发送http请求是在run as daemon之后吗?最好写个最小demo复现这个问题,我就可以本地调试看看

@yqmm666
Copy link
Author

yqmm666 commented Feb 6, 2025

drogon::app().loadConfigFile(path_server_root / "config.json");
drogon::app().setUploadPath(path_upload);

if (run_as_daemon)
{ //
    drogon::app().setLogPath(path_log_files);
    drogon::app().enableRunAsDaemon();
}
else
    Create_PidFile(path_server_root);

我发现当我的config.json文件中含有redis_clients的配置时,run_as_daemon后无法发送httpclient,当我删除config.json中的redis相关配置时一切正常。(实际我的程序中没有用到redis,配置中的redis描述是之前项目的残留)

"redis_clients": [
{
//name: Name of the client,'default' by default
//"name":"",
//host: Server IP, 127.0.0.1 by default
"host": "127.0.0.1",
//port: Server port, 6379 by default
"port": 6379,
//username: '' by default which means 'default' in redis ACL
"username": "",
//passwd: '' by default
"passwd": "",
//db index: 0 by default
"db": 0,
//is_fast: false by default, if it is true, the client is faster but user can't call
//any synchronous interface of it.
"is_fast": false,
//number_of_connections: 1 by default, if the 'is_fast' is true, the number is the number of
//connections per IO thread, otherwise it is the total number of all connections.
"number_of_connections": 1,
//timeout: -1.0 by default, in seconds, the timeout for executing a command.
//zero or negative value means no timeout.
"timeout": -1.0
}
],

这些信息是否足够?

@yqmm666
Copy link
Author

yqmm666 commented Feb 6, 2025

发送httpclient是在run_as_daemon之后,在我的server收到一个请求后,我要在这个请求中去httpclient给另外一个server。
并且关键是,我的项目规划确实需要redis。

@an-tao
Copy link
Member

an-tao commented Feb 6, 2025

按理说,HttpClient和redisClient是没有关系的。如果他们冲突了,一定有潜在的bug。你可以先自己在框架里加些断点或者log尝试解决。我需要完整的demo才好调试,因为触发这个问题跟具体的写法可能密切相关。

@yqmm666
Copy link
Author

yqmm666 commented Feb 7, 2025

`#include <drogon/drogon.h>

#include
#include

#ifdef linux
#include <sys/socket.h>
#include <netinet/tcp.h>
#endif

using namespace drogon;

int nth_resp = 0;

int main(int argc, char const* argv[])
{

bool run_as_daemon{ false };

if (argc == 2 && std::string(argv[1]) == "-d")
{
    LOG_INFO << "enableRunAsDaemon";
    run_as_daemon = true;

}

app().loadConfigFile("config_test.json");
app().setLogPath("./"); 
app().addListener("0.0.0.0", 5888);

if (run_as_daemon)
{ //

    drogon::app().enableRunAsDaemon();
}
trantor::Logger::setLogLevel(trantor::Logger::kDebug);

app().registerHandler(
    "/test",
    [](const HttpRequestPtr&,
        std::function<void(const HttpResponsePtr&)>&& callback) {

            auto client = HttpClient::newHttpClient("http://www.baidu.com");
            auto req = HttpRequest::newHttpRequest();
            req->setMethod(drogon::Get);
            req->setPath("/s");
            req->setParameter("wd", "wx");
            req->setParameter("oq", "wx");
            client->sendRequest(
                req, [callback](ReqResult result, const HttpResponsePtr& response) {
                    if (result != ReqResult::Ok)
                    {
                        LOG_INFO
                            << "error while sending request to server! result: "
                            << result;
                        auto resp = HttpResponse::newHttpResponse();
                        resp->setBody("send error!");
                        callback(resp);
                        return;
                    }

                    LOG_INFO << "receive response!";
                    auto resp = HttpResponse::newHttpResponse();
                    resp->setBody("send ok!");
                    callback(resp);
                });



    },
    { Get });



app().run();

}

config_test.json

`
demo我是这样写的,config_test.json里面删掉redies部分就可以正常 run_as_daemon.不知道是不是对框架的理解不够,哪里写的不对,请查看,谢谢~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants