日常应用中会用到定时器来进行缓存的删除或更新,@Scheduled是一个非常好的工具
@Scheduled(cron = "* * * * * *")
使用说明:cron表达式:{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}{秒数}{分钟} ==> 允许值范围: 0~59 ,不允许为空值,若值不合法,调度器将抛出SchedulerException异常 “*“: 代表每隔1秒钟触发;
经典用法:
1. “30 * * * * ?” 每半分钟触发任务
2. “30 10 * * * ?” 每小时的10分30秒触发任务
3. “30 10 1 * * ?” 每天1点10分30秒触发任务
4. “30 10 1 20 * ?” 每月20号1点10分30秒触发任务
5. “30 10 1 20 10 ? *” 每年10月20号1点10分30秒触发任务
6. “30 10 1 20 10 ? 2011” 2011年10月20号1点10分30秒触发任务
7. “30 10 1 ? 10 * 2011” 2011年10月每天1点10分30秒触发任务
8. “30 10 1 ? 10 SUN 2011” 2011年10月每周日1点10分30秒触发任务
9. “15,30,45 * * * * ?” 每15秒,30秒,45秒时触发任务
10. “15-45 * * * * ?” 15到45秒内,每秒都触发任务
11. “15/5 * * * * ?” 每分钟的每15秒开始触发,每隔5秒触发一次
12. “15-30/5 * * * * ?” 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
13. “0 0/3 * * * ?” 每小时的第0分0秒开始,每三分钟触发一次
14. “0 15 10 ? * MON-FRI” 星期一到星期五的10点15分0秒触发任务
15. “0 15 10 L * ?” 每个月最后一天的10点15分0秒触发任务
16. “0 15 10 LW * ?” 每个月最后一个工作日的10点15分0秒触发任务
17. “0 15 10 ? * 5L” 每个月最后一个星期四的10点15分0秒触发任务
18. “0 15 10 ? * 5#3” 每个月第三周的星期四的10点15分0秒触发任务
我写的一个定时器(仅供参考):
/**
* 定时器:每三十分钟执行一次 判断有没有过期 如果过期了 就取出来
*/
@Transactional
// {秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
@Scheduled(cron = "0 0/30 * * * ?")
public void timer() {
// 得到当前毫秒数
long timeoutPeriod = System.currentTimeMillis();
// 得到超时邀请码集合
Set<Object> results = redisCache.zRangeByScore(CHECK_DRAINAGE_NUM, timeoutPeriod);
// 遍历
if (!ObjectUtils.isEmpty(results)) {
for (Object result : results) {
// 得到邀请码
String drainageCode = (String) result;
// 清除缓存
redisCache.zRemove(CHECK_DRAINAGE_NUM, drainageCode);
// 得到分享主键
Long drainageRecordId = drainageRecordService.selectId(drainageCode);
// 得到用户编号
Long custId = drainageRecordService.selectCustId(drainageRecordId);
// 得到注册新用户人数
int nums = inviteRecordService.selectNewCustNums(drainageCode);
RewardDistributionDTO reward = new RewardDistributionDTO();
if (nums >= 5 && nums < 10) {
rewardInfo(reward, nums, 0, custId, drainageRecordId, drainageCode);
ExceptionUtil.businessException("恭喜您获得了月卡~");
} else if (nums >= 10) {
rewardInfo(reward, nums, 1, custId, drainageRecordId, drainageCode);
ExceptionUtil.businessException("恭喜您获得了季卡~");
} else {
baseMapper.updateInfo(drainageCode);
inviteRecordService.updateInfo(drainageRecordId);
ExceptionUtil.businessException("本周活动结束啦~如果没有领取成功,可再次分享~");
}
}
}
}