這是我們業務中的一段代碼,主要的邏輯就是將數據根據銀行賬號分組,每一組也就是每個銀行賬號起一個線程處理業務邏輯.現在出現的問題就是有線上小概率生成重復數據,本地測試嘗試還原場景,但是一直不能復現問題.
相關代碼
這是入庫的實體 writeOffDailyReport.也即是這個實體生成的時候重復了.
ExecutorService cachedThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2);
List<Future> futures = Lists.newArrayList();
for (String value : Sets.newHashSet(multimap.keys())) {
futures.add(cachedThreadPool.submit(() -> {
Thread thread = Thread.currentThread();
logger.info("開啟一條線程," +
": " + value + ",線程信息: 線程id" + thread.getId() + " 線程名" + thread.getName());
values.add(value);
List<WriteOffDailyReport> subList = Lists.newArrayList();
BigDecimal initAmount = BigDecimal.ZERO;
BigDecimal finalAmount = BigDecimal.ZERO;
BigDecimal bankDifferenceBD = BigDecimal.ZERO;
List<AnalysisBankBillVo> analysisBankBillVoList = this.getAnalysisBankBillthrowEx(MyUtils.formatNumber(value), exportDate);
WriteOffDailyReport reportFromAnalysisBankBill = this.setValueFromAnalysisBankBill(analysisBankBillVoList);
logger.info("開始遍歷銀行賬號: " + value + " 下的所有機構核銷數據");
for (WriteOffData writeOffDataExample : Lists.newArrayList(multimap.get(value))) {
logger.info("開始執行 銀行賬號: " + value + "下 機構: " + writeOffDataExample.getOrgName());
WriteOffDailyReport writeOffDailyReport = new WriteOffDailyReport();
writeOffDailyReport.setStatus("00");
this.setValueFromWriteOffData(exportDate, writeOffDataExample, writeOffDailyReport);
List<OrgConfig> orgConfigs = this.setValueFromOrgConig(writeOffDailyReport, orgConfigMultimap, writeOffDataExample);
this.setValueFromYesterDayReport(exportDate, writeOffDailyReport);
initAmount = new BigDecimal(writeOffDailyReport.getBankInitialBalance());
finalAmount = new BigDecimal(writeOffDailyReport.getBankFinalBalance());
bankDifferenceBD = this.computeBankDifference(bankDifferenceBD, writeOffDailyReport);
this.computeBusinessIncome(writeOffDailyReport);
this.computeBankIncomeOrPayout(writeOffDailyReport, orgConfigs);
this.setValueFromReportAnalysisBankBill(reportFromAnalysisBankBill, writeOffDailyReport);
subList.add(writeOffDailyReport);
logger.info("銀行賬號: " + value + "下 機構: " + writeOffDataExample.getOrgName() + " 完畢!");
}
logger.info("將銀行賬號: " + value + " 下差異匯總計算");
bankDifferenceBD = computeBankDifferenceExpand(bankDifferenceBD, reportFromAnalysisBankBill);
logger.info("開始匯總插入/更新核銷日報");
for (WriteOffDailyReport dailyReport : subList) {
dailyReport.setBankDifference(MyUtils.initValue(initAmount.add(bankDifferenceBD).subtract(finalAmount).toPlainString()));
this.sortListFromDailyReport(batchAdd, batchUpdate, dailyReport);
}
return true;
}));
}
現在是將多線程去掉在跑,效率有點低.對多線程處理還是不熟悉,望指教.
1 回答

ABOUTYOU
TA貢獻1812條經驗 獲得超5個贊
List<AnalysisBankBillVo> analysisBankBillVoList = this.getAnalysisBankBillthrowEx(MyUtils.formatNumber(value), exportDate);
WriteOffDailyReport reportFromAnalysisBankBill = this.setValueFromAnalysisBankBill(analysisBankBillVoList);
應該是這里生成的邏輯問題. 沒看到里邊也不太好說. future是不是必須的如果不是必須的,先把這里去掉,一步一步的排查,,這種使用模式肯定是沒有問題的.
添加回答
舉報
0/150
提交
取消