我正在编写一个处理我的http请求的模块。为此,我在模块中添加了位置内容处理程序(或位置指令处理程序)。我的内容处理程序与一个非异步的库接口。因此,在处理程序中,我将一个任务排队到nginx线程池中。我还添加了一个线程完成处理程序。
我遇到的问题是Nginx不等待线程完成。在位置内容处理程序中,我将任务排队并返回NGX_DONE,并且Nginx在线程运行时最终确定了我的请求。我还尝试将此处理程序代码连接到HTTP_CONTENT_PHASE处理程序中,而不是位置内容处理程序中,但是到目前为止还没有运气。
如何在最终完成HTTP_CONTENT_PHASE中的请求之前让Nginx等待线程完成?
答案 0 :(得分:0)
我终于找到了解决方案。这是一些相关的代码段。
从HTTP请求处理程序(或位置指令处理程序)对要排队的任务进行排队
typedef struct {
ngx_http_request_t *pHttpRequest;
} ngx_thread_ctx;
static ngx_int_t ngx_http_rdm_agent_handler(ngx_http_request_t *r)
{
ngx_thread_task_t *task;
ngx_thread_ctx *thread_ctx; // Thread context is my struct
// that has pointer to nginx_request_t struct
..........
..........
thread_ctx = (ngx_thread_ctx*)(task->ctx);
thread_ctx->pHttpRequest = r;
task->handler = my_thread_callback;
task->event.handler = my_thread_completion;
task->event.data = thread_ctx;
//*** This is the key part. Increment this so nginx
//*** won't finalize request (r)
r->main->blocked++;
// loc_cf -> location config struct where I added thread pool during
// configuration phase
if (ngx_thread_task_post(loc_cf->pThreadPool, task) != NGX_OK) {
r->main->blocked--;
return NGX_ERROR;
}
return NGX_DONE;
}
线程的完成处理程序
static void my_thread_completion(ngx_event_t *ev)
{
ngx_thread_ctx *ctx = (ngx_thread_ctx*)ev->data;
ctx->pHttpRequest->main->blocked--;
ngx_http_finalize_request(ctx->pHttpRequest, NGX_DONE);
}