quartz定时任务中JobDataMap的使用场景-1

描述

  • JobDataMap可以在定时任务中存储数据,可以通过触发器获取使用,如下:
JobDataMap jobDataMap = JobExecutionContext.getTrigger().getJobDataMap();
long value = Long.parseLong((String) jobDataMap.get("value"));
  • 都知道他可以用来传值,那么有什么应用场景呢?
  • 假如我我需要通过一个定时任务,每5分钟执行一次统计当五分钟内的成交总额。简单的实现逻辑如下:
/**
 * 查询5分钟内产生的流水,统计成交的金额总和
 */
public class JobDeviceRechargeStat implements Job {
    
    
    private static final Logger logger = LoggerFactory.getLogger(JobDeviceRechargeStat.class);
    
    @Override
    public void execute(JobExecutionContext context) {
    
    
        logger.info("开始执行 DeviceRechargeStatJob ...");

        // 获取JobDataMap中的数据
        long endTime = DateUtil.getCurrentTimeSecond().longValue() * 1000; //确保是整秒
        // 五分钟前的时间戳, 必须与定时任务执行的频率一致否则会到导致数据重复计算或数据遗漏
        long startTime = endTime - 1000*60*5; 

        // 查询一段时间内的校验流水,然后再保存到统计的表中,这里不详细写了...
        // payRecordRepo.getDevicePayRecordBoByTime(startTime, endTime);
        
        logger.info("执行结束 DeviceRechargeStatJob ...");
    }
}

  • 上面这里例子我们看到了有一些弊端:五分钟前的时间戳, 必须与定时任务执行的频率一致否则会到导致数据重复计算或数据遗漏。如果需要改成统计每10分钟的交易流水时,我们不仅需要修改cron,而且需要修改代码。
  • 针对这个问题,可想而知1000*60*5并不能直接写死在这里。于是我们可以通过把该值通过JobDataMap在定时任务启动时中传递过来。
public class JobDeviceRechargeStat implements Job {
    
    

    private static final Logger logger = LoggerFactory.getLogger(JobDeviceRechargeStat.class);

    @Override
    public void execute(JobExecutionContext context) {
    
    
        logger.info("开始执行 DeviceRechargeStatJob ...");

        // 获取JobDataMap中的数据
        long endTime = DateUtil.getCurrentTimeSecond().longValue() * 1000; //确保是整秒
        JobDataMap jobDataMap = context.getTrigger().getJobDataMap();
        long timeInterval = Long.parseLong((String) jobDataMap.get("timeInterval"));
        long startTime = endTime - timeInterval; // timeInterval必须与定时任务执行的频率一致否则会到导致数据重复计算或数据遗漏

        // 查询一段时间内的校验流水,然后再保存到统计的表中,这里不详细写了...
        // payRecordRepo.getDevicePayRecordBoByTime(startTime, endTime);

        logger.info("执行结束 DeviceRechargeStatJob ...");
    }
}
  • 这样的话,我们仅仅需要通过定时任务管理界面(通常应该会做这个页面吧),修改这个定时任务的配置便可以实现了。

最后

  • 如果在这里获得过启发和思考,希望点赞支持!对于内容有不同的看法欢迎来信交流。
  • 技术栈 >> java
  • 邮箱 >> [email protected]

Guess you like

Origin blog.csdn.net/qq_39529562/article/details/107415732