版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zg_hover/article/details/82181615
概述
本文讲述beanstalkd touch命令的实现原理。
touch命令说明
该命令允许消费者(worker)请求更多的时间执行job,当需要预留更多的时间来执行该jog是,该命令很有用。消费者(worker)可用周期的告诉服务器它仍然在执行job。
- touch命令的格式如下:
touch <id>\r\n
- 参数说明
- id:为job id
- 响应
- TOUCHED\r\n 表明成功
- NOT_FOUND\r\n 如果job不存在或者client没有预订此job
touch命令实现原理说明
touch命令的实现步骤如下:
- 获取参数:job id
- 从全局job哈希表中查找该job,若该job所在的连接是当前连接,且job的状态是Reserved,则重置该job的过期时间
这样,可以让该job处于ready状态的时间更长,让该job拥有更长的执行时间。
源码分析
touch功能是在下面的函数中实现的:
j = touch_job(c, job_find(id));
job_find()函数的功能是:从全局变量all_jobs哈希表中查找对应id的job。
- touch_job函数
//若job的订阅者(reserver)是当前连接,且job的状态是Reserved,返回该Job
static job
find_reserved_job_in_conn(Conn *c, job j)
{
return (j && j->reserver == c && j->r.state == Reserved) ? j : NULL;
}
// 重新设置该job的过期时间(j->r.deadline_at字段)值为:j->ttr+now()
static job
touch_job(Conn *c, job j)
{
j = find_reserved_job_in_conn(c, j);
if (j) {
j->r.deadline_at = nanoseconds() + j->r.ttr;
c->soonest_job = NULL;
}
return j;
}