在 Spring 框架中,可以使用定时任务来执行周期性或延迟执行的任务。Spring 提供了多种方式来配置和管理定时任务。有Java自带的java.util.Timer类,也有强大的调度器Quartz,还有SpringBoot自带的Scheduled。
在实际应用中,如果没有分布式场景(quartz 支持分布式, schedule 不支持(需要自己实现,用分布式锁),schedule跟spring结合的更好,还是很适用的。
以下介绍的是使用@Scheduled 注解的方式:
@Scheduled(cron = "0 22 14 * * ? ")
@Override
public void testSchedule() {
System.out.println("测试定时器");
log.debug("定时任务已启动");
}
cron:cron表达式,指定任务在特定时间执行;
fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
zone:时区,默认为当前时区,一般没有用到。
业务分析:
(1)预加载能够访问系统的用户(即用户数据存在在数据库中)
实现逻辑:查找数据库中所有有效用户放入availableUsers哈希表中;
给有效用户设置缓存过期的时间,超时删除availableUsers表中该用户缓存。
(2)每个用户有60s时间登录访问系统,超出60秒,从系统中删除
需要判断:该用户是否存在(数据库)
该用户是否超时(能否访问系统)
UserService层接口方法
/**
* 1、从数据库查出所有用户放入 aviableUsers
*/
void preLoginUser();
//2、redis VIP用户登录预加载,超时删除该用户
void preStoreUserInRedis(long roleId);
//3、使用上面preStoreUserInRedis方法将roleId=1的有效用户放入vipLoginUsers哈希表中
void vipLogin(String username, String password);
UserServiceImpl实现类
//1、查找数据库中所有有效用户放入availableUsers哈希表中
@Scheduled(cron = "0 06 16 * * ?")
@Override
public void preLoginUser() {
List users = userDao.findAll();
users.forEach(u->
objectRedisTemplate.opsForHash().put("availableUsers","availableUsers:"+u.getUsername(),u));
objectRedisTemplate.expire("loginUsers",1, TimeUnit.DAYS);
}
//2、redis VIP用户登录预加载,超时删除该用户
@Override
public void preStoreUserInRedis(long roleId) {
// List users = userDao.findAll();
// users.forEach(u->
// objectRedisTemplate.opsForHash().
// put("loginUser","loginUser:"+u.getUsername(),u));
// objectRedisTemplate.expire("loginUser",60, TimeUnit.SECONDS);
//
// Set
控制层
//3、VIP用户按时登录完成
@GetMapping("/vipLogin")
public HttpResp vipLogin(String username, String password){
userService.vipLogin(username,password);
return HttpResp.success("按时登录完成");
}
//2、预先加载所有vip客户到缓存中,根据roleId=?查询出的(业务实现层)
@GetMapping("/setVip")
public HttpResp setVip(long roleId){
userService.preStoreUserInRedis(roleId);
return HttpResp.success("预先加载所有vip客户到缓存中");
}
参考:
SpringBoot学习-(十九)SpringBoot定时器#Schedule_wx6345200418f8c的技术博客_51CTO博客
https://www.cnblogs.com/toutou/p/9802955.html
感谢阅读,码字不易,多谢点赞!如有不当之处,欢迎反馈指出,感谢!