开门见山、实现用户解封功能:
本来打算将每个封号用户设定一个定时任务,到期自动解封。实现起来发现,需要将定时数据储存在数据库中,且效率很低,再加上学的一知半解,最后决定采用轮询,设置每五分钟,或者每小时乃至每天轮询一次,去调用业务,当查找到解封日期到期时,对其进行解封。
除了必要的导入依赖以外,一共就俩文件:
<!--定时任务框架quartz-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
一个是Job的具体需要实现的任务:(只是其中一种方法,还有一种是继承)
package com.video.quartz;
import com.video.service.BanService;
import com.video.util.MsgUnblock;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class UnblockJob implements Job {
@Resource
private BanService banService;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//调用解封轮询功能
MsgUnblock msgUnblock = banService.quartzUnblockUserQuartz();
System.out.println(dateFormat.format(new Date())+": 轮询解封运行---->");
System.out.print(" 本次解封成功人数:"+msgUnblock.getSuccessNum()+",失败人数:"+msgUnblock.getFailNum());
}
}
另一个是自定义一个配置文件:
package com.video.config;
import com.video.quartz.UnblockJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
@Configuration
public class QuartzConfig {
@Bean
public JobDetail BanJobDetail() {
return JobBuilder.newJob(UnblockJob.class)
.withIdentity("UnblockJob", "group1")
.storeDurably()
.build();
}
@Bean
public Trigger BanTrigger() {
return newTrigger()
.withIdentity("trigger1", "group1")
//设置运行时间规则(这里是10分钟运行一次)
.withSchedule(cronSchedule("0 0/5 * * * ?"))
.forJob("UnblockJob", "group1")
.build();
}
}
效果图:
记录一个新知识:
比较时间大小的方法:
int check = userBan.getUnblockDate().compareTo(nowDate);
虽然代码不多,但是我足足研究了一天的quartz的官方文档,还是缺少开发经验。
学的是一知半解,勉强记录一下。
还有不到两个月就实习了,尽量攒一点经验。
学习Quartz定时任务框架,需要了解几个参数:
详情可了解文档:https://www.w3cschool.cn/quartz_doc/quartz_doc-1xbu2clr.html
-
Scheduler - 与调度程序交互的主要API。
-
Job - 你想要调度器执行的任务组件需要实现的接口
-
JobDetail - 用于定义作业的实例。
-
Trigger(即触发器) - 定义执行给定作业的计划的组件。
-
JobBuilder - 用于定义/构建 JobDetail 实例,用于定义作业的实例。
-
TriggerBuilder - 用于定义/构建触发器实例。
-
Scheduler 的生命期,从 SchedulerFactory 创建它时开始,到 Scheduler 调用shutdown() 方法时结束;Scheduler 被创建后,可以增加、删除和列举 Job 和 Trigger,以及执行其它与调度相关的操作(如暂停 Trigger)。但是,Scheduler 只有在调用 start() 方法后,才会真正地触发 trigger(即执行 job)