本文以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; }