数据隔离
按照数据的状态进行数据隔离。非条件内的数据不应该被轮询到
数据锁定
给数据行一个锁定时间,如: pullHandleLockTime. 当前时间小于pullHandleLockTime那么轮询时拿不到该记录。
自动降级
自动降级,这里处理的是数据的优先级,即让数据的优先程度靠后。这里直接采用数据库轮询次数进行排序,次数越小越优先,即最容易成功,将不容易成功的或已失败的数据轮询优先级调低。
示例代码
/**
* 拉取指定状态合同号启用的记录
*
* @param quoteType 拆单报价类型
* @return {@code OrderInfo}
*/
@Select("SELECT * FROM bomb_separate_order_info WHERE quoteType = #{0} and separateProcessStatus = #{1} and pullHandleLockTime<=#{2} and enabled = 0 and omsSyncTimes < 3 order by omsSyncTimes asc limit 1 ")
OrderInfo pullEnabledOrderInfoForOms(QuoteType quoteType, MainOrderStatus mainOrderStatus,Long pullHandleLockTime);
/**
* 拉取指定状态合同号启用的记录
*
* @param quoteType 拆单报价类型
* @return {@code OrderInfo}
*/
@Select("SELECT * FROM bomb_separate_order_info WHERE quoteType = #{0} and separateProcessStatus = #{1} and pullHandleLockTime<=#{2} and enabled = 0 and lsSyncTimes < 3 order by lsSyncTimes asc limit 1 ")
OrderInfo pullEnabledOrderInfoForFactory(QuoteType quoteType, MainOrderStatus mainOrderStatus,Long pullHandleLockTime);
定时任务
下面是CompletableFuture实现的定时任务处理。
@Scheduled(cron = "0/30 * * * * ?")
public void pull() {
PullingDataTypeParameter parameter = notifySyncBombStatusService.getNodeRegisterService().getNodeParameter();
SeparateRestService restService = notifySyncBombStatusService.getNodeRegisterService().selectOauthService();
SyncBombContractOrder syncBombContractOrder = restService.pollingBombCompletedOrderToFactory(parameter);
if (null != syncBombContractOrder) {
CompletableFuture.supplyAsync(() -> {
try {
log.info("开始同步数据........");
syncBombDataService.syncData(syncBombContractOrder);
log.info("开始同步数据......完成");
return 1;
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}).handle((result,e)->{
if(null != e){
log.error("同步数据异常......通知更新数据错误信息....");
StringBuilder sb = new StringBuilder(e.getCause().getMessage());
sb.append(e.getMessage());
notifySyncBombStatusService.notifySyncBombStatusInfo(syncBombContractOrder,sb.toString());
}else{
log.info("同步数据成功......通知更新数据成功信息....");
notifySyncBombStatusService.notifySyncBombStatusInfo(syncBombContractOrder,"");
}
return result;
});
} else {
log.warn("{}轮询消费BOMB数据同步,暂无需要处理的数据!!!", parameter.getDestination());
}
}