描述
- JobDataMap可以在定时任务中存储数据,可以通过触发器获取使用,如下:
JobDataMap jobDataMap = JobExecutionContext.getTrigger().getJobDataMap();
long value = Long.parseLong((String) jobDataMap.get("value"));
- 都知道他可以用来传值,那么有什么应用场景呢?
- 假如我我需要通过一个定时任务,每5分钟执行一次统计当五分钟内的成交总额。简单的实现逻辑如下:
public class JobDeviceRechargeStat implements Job {
private static final Logger logger = LoggerFactory.getLogger(JobDeviceRechargeStat.class);
@Override
public void execute(JobExecutionContext context) {
logger.info("开始执行 DeviceRechargeStatJob ...");
long endTime = DateUtil.getCurrentTimeSecond().longValue() * 1000;
long startTime = endTime - 1000*60*5;
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 ...");
long endTime = DateUtil.getCurrentTimeSecond().longValue() * 1000;
JobDataMap jobDataMap = context.getTrigger().getJobDataMap();
long timeInterval = Long.parseLong((String) jobDataMap.get("timeInterval"));
long startTime = endTime - timeInterval;
logger.info("执行结束 DeviceRechargeStatJob ...");
}
}
- 这样的话,我们仅仅需要通过定时任务管理界面(通常应该会做这个页面吧),修改这个定时任务的配置便可以实现了。
最后