问题:
做的spirng——ssm小说网站项目有vip,部分小说需要vip才能阅读,但是vip是有期限的,到期后需要清除vip状态,怎么清除呢?
本来想的是在登陆的时候更新,但是转念一想,写在登陆代码块里无关的代码会增加耦合,并且不太符合个vip逻辑。
方式:通过计时器解决:
然后我就思考,设定一个定时执行的sql语句不就行了吗?
最开始的时候我想,如何设置一个定时执行的sql,我就一直百度,mysql确实有这种功能,不过功能,复杂,并且可读性不好!
那有什么可读性好的,并且配置简单的定时任务呢?
诶?就是我们的ssm自带的time定时任务啦!
spring mvc中有个执行定时任务的定时器,功能算不上强大,但是胜在配置方便
在mvcxml加入对应的约束文件
xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd">
简单配置下mvc,记得要扫下包哦
最后加上@Scheduled注解就可以定义执行频率,就可以测试了哦
//@Scheduled(cron = “0 0 1 * * ?”)//每天凌晨1点整
//@Scheduled(cron = “0 30 0 * * ?”)//每天凌晨0点30分
//@Scheduled(cron = “0 */60 * * * ?”)//1小时处理一次
配上我的sql语句就可以执行更新vip状态了哦
![在这里插入图片描述](https://img-blog.csdnimg.cn/b0be9e9d6e6b481e94374bee5fa62c0c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-q5Lya5YaZYnVn55qE6Z2T5LuU,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center
@Update("UPDATE `user` LEFT JOIN `user_vip` ON (`user`.`name`= `user_vip`.`name`) SET state = '0' WHERE (end_time < NOW() or user_vip.end_time IS NULL)")
public Integer updateVipState2();
/**
*过期的vip清理vip表
* @param
* @return
*/
@Update("DELETE FROM user_vip WHERE (end_time< NOW())")
public Integer deleteVipState();
import com.xxx.example.dao.vip.VipDao;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class DeleteVipTimer {
@Resource
private VipDao vipDao;
@Scheduled(cron = "* */30 * * * ?")//表明该方法是一个定时任务,每30分钟执行一次
public void test1() {
System.out.println("定时任务清理vip开始,每30分钟执行一次..........");
vipDao.updateVipState2();
vipDao.deleteVipState();
}}
结果:成功了哦!
@Scheduled参数部分,总共包含8各部分,我们来分别看一下其作用:
cron:一个类似cron的表达式,扩展了通常的UN * X定义,包括秒,分,时,星期,月,年的触发器。
***fixedDelay:在最后一次调用结束和下一次调用开始之间以固定周期(以毫秒为单位)执行带注释的方法。(要等待上次任务完成后)
fixedDelayString:同上面作用一样,只是String类型
fixedRate:在调用之间以固定的周期(以毫秒为单位)执行带注释的方法。(不需要等待上次任务完成)
fixedRateString:同上面作用一样,只是String类型
initialDelay:第一次执行fixedRate()或fixedDelay()任务之前延迟的毫秒数 。
initialDelayString:同上面作用一样,只是String类型 zone:指明解析cron表达式的时区。***
3.1:按顺序依次为