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
  • 邮箱 >> 15673219519@163.com
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放码过来_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值