1.配置(dd.conf)
dd.conf 增加以下配置项:
<rule_range> <!--规则范围 -->
<mode>2</mode><!--1:处理所有规则 2:仅处理配置中指定的规则,支持多dd部署.默认:1 -->
<rule>10,11,12</rule> <!-- 当mode=2时表示本模块处理的规则列表 -->
</rule_range>
<schedule_mode>1</schedule_mode> <!-- 1: 每规则一个线程 2:指定任务(同一任务的规则顺序处理) 默认:1-->
<tasks> <!-- 抽取任务,仅schedule_mode=2的情况才有效-->
<item>
<strategy>4,0,(1),(2200),60</strategy>
<rule>10,11</rule> <!--规则10,11串行处理 -->
</item>
</tasks>
目前不支持<schedule_mode>为2的情况.
<strategy>定义的调度策略将覆盖规则的定义,任务的一组规则使用相同的策略.
<strategy>的配置见下文说明
http://blog.csdn.net/wherwh/article/details/10562067
ouy项目可采用如下简化的配置:
<rule_range> <!--规则范围 -->
<mode>2</mode><!--1:处理所有规则 2:仅处理配置中指定的规则,支持多dd部署.默认:1 -->
<rule>10,11,12</rule> <!-- 当mode=2时表示本模块处理的规则列表 -->
</rule_range>
其中,<rule>是每个dd处理的规则列表.
2.代码修改
2.1 dd.h
class CDd: public IDd, public CQQBasePlugin, public ACE_Event_Handler { private: ///< 多dd部署 short rule_range_; /// 1:处理所有规则 2:仅处理配置中指定的规则,支持多dd部署.默认:1 vector<CQQ_RULEID> rule_list_; ///< rule_range_==2时,本模块处理的规则列表 short schedule_mode_; ///< 1: 每规则一个线程 2:指定任务(同一任务的规则顺序处理) 默认:1 bool FindRule_i(CQQ_RULEID rule_id);///< 检查是否是本模块处理的规则 }; |
2.2 dd.cpp
CDd::CDd():CQQBasePlugin() { orgid_ = 0; file_order_ = 1; export_record_expired_ = 15; /// qry_timeout_ = 300; valid_string_ = false; deploy_mode_ = 0; data_file_format_ = 1; rule_range_ = 1; schedule_mode_ = 1; AddFuncMap(func_,sizeof(func_)/sizeof(func_[0])); } int CDd::ReadPrivateConfig() { if (parent::ReadPrivateConfig()) return -1; if (config_->Open(cf_.c_str())) { ACE_ERROR_RETURN((LM_ERROR,"open config file %s failure.\n",cf_.c_str()),-1); } INode *root = config_->GetChildNodes()->GetChildNodes("config")->GetChildNode(0); INode *node; node = root->GetChildNode()->GetChildNodes("rule_range")->GetChildNode(0); if (node) { ///< @note 未做严格的配置有效性检查 INode *mode_node = node->GetChildNode()->GetChildNodes("mode")->GetChildNode(0); INode *rule_node = node->GetChildNode()->GetChildNodes("rule")->GetChildNode(0); this->rule_range_ = (int)*mode_node; if (this->rule_range_==2) { string s = (string)*rule_node; vector<string> vs; SplitString(s.c_str(),vs,','); vector<string>::iterator iter = vs.begin(); while(iter!=vs.end()) { CQQ_RULEID rule_id = atol(iter->c_str()); this->rule_list_.push_back(rule_id); iter++; } ///< @note 从数据库加载规则时再验证配置的规则是否有效 } } ... } /// 读入规则,并进行检查 int CDd::LoadRules() { ///< 读单据接口定义,检查是否与抽取规则相符 GETDBC(pdbor,local_dbc_.c_str()); string sql; /// 从数据抽取规则表中读规则 sql = "select a.*,sheet_type,f001n_1126,f002n_1126 from tb_5606 a,tb_1126 b where b.object_id=a.iid and f005n_1126=1"; CRecordset *prs = pdbor->Query(adCmdText,sql.c_str()); if (prs==0) { ACE_ERROR_RETURN((LM_ERROR,"读接口数据抽取规则失败.SQL:%s,错误:%s.\n",sql.c_str(),pdbor->GetLastError()),-1); } while(!prs->IsEof()) { CRule *rule = 0; if (GetRuleFromRecord(prs,&rule)) { pdbor->ReleaseRecordset(prs); return -1; } if ((rule->active_flag_)&&((this->rule_range_==1)||FindRule_i(rule->id_))) { ///< 只处理有效且自动执行的规则 rules_.push_back(rule); } else delete rule; prs->Move(); } ... } bool CDd::FindRule_i(CQQ_RULEID rule_id) { vector<CQQ_RULEID>::iterator iter = rule_list_.begin(); while(iter!=rule_list_.end()) { if (*iter==rule_id) return true; iter++; } return false; } |
3.注意事项
多dd部署时有以下限制:
- 各个dd之间不会协调,不要重复配置和漏掉规则
- 适合后台方式,不适合外部触发的规则
4.TODO
- 支持<schedule_mode>为2的情况