風控系統許多規則 須要調用本地數據源(如數據庫) 查詢出相關信息 進行校驗 如java
規則1 -- 1天內該客戶的申請次數 若是申請次數在0-10次 (含)之間,則經過,不然拒絕或人工複覈。git
規則2 -- 1天內自動拒絕次數 若是自動拒絕次數在0-3 次(含)之間,則經過,不然拒絕或人工複覈。github
規則3 -- 1天內授信額度範圍 若是授信的總額度在0-3000 (含)元之間,則經過,不然拒絕或人工複覈。數據庫
...app
假如上面的每個規則 都對應一個DAO方法 如code
int countApply(String idcard,int daysAgo); int countRefusedApply(String idcard, int daysAgo); int sumCreditAmount(String idcard, int daysAgo);
而一個場景 如現金貸 會對應不少本地數據源的規則 如何知道哪一個規則對應哪一個DAO以及該DAO中的哪一個方法呢?get
目前 我是經過以下的方式去處理的源碼
在配置文件中 記錄規則ID與對應的DAO方法的映射關係it
1=applyDAO#countApply#idcard,0 2=applyDAO#countRefusedApply#idcard,0 3=applyDAO#sumCreditAmount#idcard,0
批量查詢場景包含規則的本地數據io
/** * 批量查詢本地數據源信息 * @param applyInfo 用戶申請信息 * @param ruleIdList 該場景對應的本地數據源規則ID列表 * @return Map ruleId : LocalData */ public Map batchQueryLocalData(ApplyInfo applyInfo,List<Integer> ruleIdList){ Map<Integer, Object> id2LocalDataMap = new HashMap<>(); for (Integer ruleId : ruleIdList) { // 找到該規則對應的配置 1=applyDAO#countApply#idcard,0 String[] split = rule2DaoMap.get(ruleId.toString()).split("#"); String daoBean = split[0]; String method = split[1]; List paramList = new ArrayList<>(); if(split.length == 3) { String args = split[2]; // 使用spel動態解析參數 resolveParamValue(applyInfo, paramList, args); } Object bean = context.getBean(daoBean); // 反射調用 Object result = ReflectionUtil.invokeMethod(bean, method, paramList.toArray(new Object[]{paramList.size()})); id2LocalDataMap.put(ruleId, result); // 保存查詢結果 } return id2LocalDataMap; }