Pull定时任务轮询数据消费的注意事项

162 阅读1分钟

数据隔离

按照数据的状态进行数据隔离。非条件内的数据不应该被轮询到

数据锁定

给数据行一个锁定时间,如: pullHandleLockTime. 当前时间小于pullHandleLockTime那么轮询时拿不到该记录。

图片.png

自动降级

自动降级,这里处理的是数据的优先级,即让数据的优先程度靠后。这里直接采用数据库轮询次数进行排序,次数越小越优先,即最容易成功,将不容易成功的或已失败的数据轮询优先级调低。

图片.png

图片.png

示例代码

/**
 * 拉取指定状态合同号启用的记录
 *
 * @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());
    }
}