第一步
导入坐标
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> <version>${spring-boot-starter-quartz.version}</version> <!-- <version>3.1.4</version>--> </dependency>
这里说一下 在创建springboot项目时可以选择i/o 中的quartz 就不需要自己在手动写入这个坐标名称了
第二步
配置yml文件
server: port: 83 logging: level: root: info spring: redis: database: 1 host: 127.0.0.1 port: 6379 timeout: 30000 jedis: pool: max-idle: 50 max-active: 20 min-idle: 4 # Quartz 的配置,对应 QuartzProperties 配置类 quartz: job-store-type: memory # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。 auto-startup: true # Quartz 是否自动启动 startup-delay: 0 # 延迟 N 秒启动 wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true overwrite-existing-jobs: true # 是否覆盖已有 Job 的配置 properties: # 添加 Quartz Scheduler 附加属性 org: quartz: threadPool: threadCount: 25 # 线程池大小。默认为 10 。 threadPriority: 5 # 线程优先级 class: org.quartz.simpl.SimpleThreadPool # 线程池类型 scheduler: instanceName: ClearJob # jdbc: # 这里暂时不说明,使用 JDBC 的 JobStore 的时候,才需要配置
第三步
创建任务类实现QuartzJobBean 并重写executeInternal方法,这个里面就是可以放需要定时执行的程序比如我这里是定时清理图片
import com.it.constant.RedisConstant; import com.it.utils.QiniuUtils; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.quartz.QuartzJobBean; import redis.clients.jedis.JedisPool; import java.util.Set; public class ClearJob extends QuartzJobBean { @Autowired private JedisPool jedisPool; @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { this.clearImg(); } public void clearImg() { System.out.println("开始quartz---------------"); //根据Redis中保存的两个set集合进行差值计算,获得垃圾图片的集合 sdiff会返回差值集合 Set<String> set = jedisPool.getResource().sdiff(RedisConstant.SETMEAL_PIC_RESOURCES, RedisConstant.SETMEAL_PIC_DB_RESOURCES); if (set != null) { for (String picName : set) { //删除七牛云服务器上的图片 QiniuUtils.deleteFileFromQiniu(picName); //从Redis中删除集合的名称 jedisPool.getResource().srem(RedisConstant.SETMEAL_PIC_RESOURCES, picName); System.out.println("清理了"+picName); } } } }
第四步
设置好了需要定时执行的程序后,需要了解
ob/JobDetail: 任务
任务指的是你要做的事,也是任务调度的核心,比如我想要每隔一个小时喝一杯水,那么任务就是“喝水”
Trigger: 触发器
触发器指的是任务触发的时间,也就是任务在什么时间开始执行。例如上一句喝水的例子,“每隔一个小时”,这就是一个触发器,触发器具有两种定时类型,一种简单定时,一种使用Cron时间表达式进行复杂定时。
需要配置的是这个JobDetail和Trigger
import org.quartz.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class QuartzConfig { @Bean public JobDetail jobDetail() { return JobBuilder.newJob(ClearJob.class) //指定任务名称 .withIdentity("ClearJob","group1") .withDescription("任务描述:定时清理图片") //每次任务执行后进行存储 .storeDurably(true) .build(); } @Bean public Trigger trigger() { //设置Cron时间表达式,此处也可用SimpleScheduleBuilder CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ? "); //创建触发器 return TriggerBuilder.newTrigger() //绑定工作任务 .forJob(jobDetail()) .withIdentity("trigger","group1") //每隔5秒执行一次job .withSchedule(cronScheduleBuilder) // .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)) .build(); }
第五步
检查启动类的位置
运行结果如下