多dd支持

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的情况


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值