在Gearmand的最新的release版本0.20中,引入了通过drizzle将任务队列的持久化功能,但是作者比较粗心,有几个地方存在问题。
都可以通过修改源代码中gearmand-0.20/libgearman-server/plugins/queue/drizzle/queue.cc来解决。
详细的步骤如下:
- 初始化的时候:如果没有手动建表通过Gearmand自动建表的话无法建立,原因是他的SQL代码有问题,
- 可能你发现任务分发处理完后SQL表中的数据还在,没有删除掉,还是SQL的处理有问题,找到函数_libdrizzle_done,将原来的
Byte query(unique_size*2 + unique_size*2 + GEARMAN_QUEUE_QUERY_BUFFER);修改为
char query[DRIZZLE_MAX_TABLE_SIZE + GEARMAN_QUEUE_QUERY_BUFFER];并且把下面的那段代码修改为:
在gearman_server_queue_libdrizzle_init函数中找到那段创建表的SQL代码,原来为
snprintf(create, sizeof(create),
"CREATE TABLE %s"
"("
"unique_key VARCHAR(%d),"
"function_name VARCHAR(255),"
"priority INT,"
"data LONGBLOB,"
"unique key (unique_key, function_name)"
"data LONGBLOB,"
"when_to_run INT"
")",
queue->table.c_str(), GEARMAN_UNIQUE_SIZE);
没错,SQL代码写错了,少了个逗号,并且重复创建了一列,修改为
snprintf(create, sizeof(create),
"CREATE TABLE %s"
"("
"unique_key VARCHAR(%d),"
"function_name VARCHAR(255),"
"priority INT,"
"data LONGBLOB,"
"when_to_run INT,"
"unique key (unique_key, function_name)"
")",
queue->table.c_str(), GEARMAN_UNIQUE_SIZE);
size_t query_size= (size_t)snprintf(query, sizeof(query),
"DELETE FROM %s WHERE unique_key=’%s’ and function_name= ‘%s’",
queue->table.c_str(),
escaped_unique_name.c_str(),
escaped_function_name.c_str());
- 重新编译,并生成问题解决。