概述
quartz的定时调度
第一步引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
第二步, 编写需要定时调度的业务代码,然后将其封装成一个
JobDetail
/**
* 这个是我们需要定时去执行的业务代码,不需要纳入到容器。
*/
public class OurTask extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// 我们在通过 JobDetail 来构建任务详情的时候, 可以通过 setJobData() 设置任务数据,
// 在具体任务执行代码中可以通过 jobExecutionContext.getMergedJobDataMap()
JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap();
UserMapper userMapper = (UserMapper) jobDataMap.get("userMapper");
User user = userMapper.selectById(4);
System.out.println(user);
}
}
第三步,封装
JobDetail
, 指定 Schedule(定时调度策略),创建Trigger,连接JobDetail 和 Schedule.
@Configuration
public class QuartzConfig {
private UserMapper userMapper;
public QuartzConfig(UserMapper userMapper) {
this.userMapper = userMapper;
}
// JobDetail, 是将我们具体要执行的业务封装成一个JobDetail
// 如果方法中接收的参数在spring ioc容器中存在, 会自动注入过来
@Bean
public JobDetail firstJobDetail() {
// 任务需要的数据, 用通过 JobDataMap 进行封装
JobDataMap dataMap = new JobDataMap();
dataMap.put("userMapper", userMapper);
// storeDurably() 将任务放到内存中, 否则不会执行.
JobDetail jobDetail = JobBuilder.newJob(OurTask.class)
// 在任务详情中设置具体的业务代码需要的一些额外的数据,与具体的业务代码中
// jobExecutionContext.getMergedJobDataMap() 是相对应的
.setJobData(dataMap)
.storeDurably().build();
return jobDetail;
}
@Bean
public Trigger simpleJobTrigger() {
// SimpleScheduleBuilder 只能按照固定的时间间隔来执行, 例如指定时间等, 它是做不了的
SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(5)
// 每5s循环一次
.repeatForever();
// 永远循环下去
// trigger进行任务调度
Trigger trigger = TriggerBuilder.newTrigger()
.withSchedule(simpleScheduleBuilder)
// 指定任务调度的规则
.forJob(firstJobDetail())
// 制定具体的任务
.startNow()
// 立即开始
.build();
return trigger;
}
@Bean
public Trigger cronJobTrigger() {
// cronSchedule() 方法要接受一个 cron 表达式, cron表达式有固定的书写模板
/**
*
* * * * * *: 六个占位, 依次代表:
秒
分
时
日
月
周
*
0/5 * * ? * *: 表示每 5s 执行一次
*
0 0/1 * * * ?: 表示每 1min 执行一次
*
0 5 8,9,10 ? * *: 表示每天的8:05 9:05 10:05 执行一次
*
0 0/10 8-20 ? * *: 表示每天的早上8点到晚上8点, 每10分钟执行一次
*
34 23 2,3 * * ?: 每天的 2:23:34 3:23:34 执行一次
*
34/5 * 9-10 * * ?: 每天的9点到10点, 每分钟的34s的开始, 每秒钟执行一次.
*
4,53,59 * * * * ?: 每分钟的第4、第53、第59秒执行一次
*/
// String cron = "0/5 * * ? * *";
String cron = "0 21 * ? * *";
// 通过指定 cron 表达式的方式,来执行具体的任务。
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron)
.withMisfireHandlingInstructionDoNothing();
Trigger trigger = TriggerBuilder.newTrigger()
.withSchedule(cronScheduleBuilder)
// 指定任务调度的规则
.forJob(firstJobDetail())
// 指定具体的任务
.startNow()
// 立即开始
.build();
return trigger;
}
}
springboot自带的定时调度
第一步,在启动类上加上
@EnableScheduling
启用定时调度
@SpringBootApplication
@EnableConfigurationProperties(UserProperty.class)
@EnableScheduling
// 开启定时调用
public class SpringbootConfigurationPropertyApplication {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(SpringbootConfigurationPropertyApplication.class, args);
}
}
第二步,编写定时调用的代码
@Component
public class MyTask {
private UserMapper userMapper;
public MyTask(UserMapper userMapper) {
this.userMapper = userMapper;
}
// cron 指定表达式,表达式的规则与 quartz 一致。
@Scheduled(cron = "0/5 * * ? * *")
public void getUser() {
System.out.println("天青色的烟雨,而我在等你");
}
}
最后
以上就是大力纸飞机为你收集整理的spring的定时调度实现(quartz和自带的)的全部内容,希望文章能够帮你解决spring的定时调度实现(quartz和自带的)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复