本文以sd插件为例说明异步任务的使用.
1.定义文件
sd.h修改class CSd增加成员:
string batch_op_task_name_; ///< 自动批操作任务名称.默认:batch_op.
IAsyncTaskEngine *async_task_engine_; ///< 异步任务引擎
IAsyncTask* batch_op_task_; ///< 自动批操作的异步任务
2.实现文件
sd.cpp修改
int CSd::ReadPrivateConfig() {
...
/// 读<batch_op_async_task_name>配置
READ_STRING(root,"batch_op_async_task_name",this->batch_op_task_name_);
...
}
int CSd::CheckValid() {
...
///< 获取异步任务队列实例
async_task_engine_ = reinterpret_cast<IAsyncTaskEngine*>(container_->GetResource(ASYNC_TASK_ENGINE));
if (async_task_engine_==0) {
nlogger_->log(LO_STDOUT|LO_FILE,SEVERITY_ERROR,"需要加载异步任务队列.\n");
return -1;
}
batch_op_task_ = async_task_engine_->Get(batch_op_task_name_.c_str());
if (batch_op_task_==0) {
nlogger_->log(LO_STDOUT|LO_FILE,SEVERITY_ERROR,"自动批操作异步任务队列%s不存在,请检查配置.\n",batch_op_task_name_.c_str());
return -1;
}
...
return 0;
}
3.配置
3.1插件配置(sd.conf)
增加配置: <!-- 默认:batch_op -->
<batch_op_async_task_name></batch_op_async_task_name>
自动批操作任务名称,需要和async_task.conf配置一致.
3.2 async_task.conf
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
<config>
<units>
<unit> <!-- 自动批操作任务队列 -->
<name>batch_op</name> <!-- 名称-->
<dbc>yoopa</dbc> <!-- 数据库连接名.默认为插件默认数据库-->
<table_name>t_Sys_AsyncTask_BatchOp</table_name> <!--异步任务队列表名称,默认:t_sys_asynctask -->
<prop>0</prop> <!-- 任务属性 bit0-是否需要返回消息(0-不返回 1-返回 默认:1) 默认:1 -->
<!--失败重做间隔,单位:秒,默认300-->
<redo_interval>60</redo_interval>
<!--失败重做任务扫描间隔,单位:秒,默认:60-->
<redo_timer_interval>60</redo_timer_interval>
<!--失败重做文件存储路径-->
<!--limit:每目录最多文件个数-->
<redo_file_path limit="1000">data/async_task/batch_op</redo_file_path>
<!--最小重做文件字节数,默认:8k-->
<redo_file_min_size>10240</redo_file_min_size>
</unit>
</units>
</config>
4.使用
写异步任务队列表的示例代码如下: AUTO_POINTER(CMsg,nmsg);
nmsg = new CMsg;
///... 构造消息包
if (batch_op_task_->Save(nmsg)) { ///< 保存到异步任务队列表
return -1;
}