SpringBoot 定时任务的两种实现方法(Scheduled和quartz)以及InitializingBean接口的作用
程序员文章站
2024-01-10 08:58:46
...
开发中肯定会遇到需要跑job的情况,这里介绍两种实现job方式,一种是boot自带的Scheduled,另一种是增加依赖的quartz.当然,每个框架都是博大精深的,这里只是简单实现。别问,问就是我也是小菜鸡
两者的不同点
- 精确度和功能
Quartz可以通过cron表达式精确到特定时间执行,而Scheduled不能。
Quartz拥有Scheduled所有的功能,而Scheduled则没有。 - 任务类的数量
Quartz每次执行都创建一个新的任务类对象。 Scheduled则每次使用同一个任务类对象。
-
对异常的处理
Quartz的某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务。
Scheduled不同,一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务。
Scheduled的使用
1.springboot启动类增加注解开启job
@EnableScheduling
2.创建job实现类
corn表达式链接,用于job的定时
InitializingBean 接口作用:bean对象在启动注册进springFactory时,会执行一次afterPropertiesSet()方法,可用于字段初始化等作用
@Component
@Slf4j
public class Job implements InitializingBean {
/**
* job任务
*/
@Scheduled(cron = "0 0 1 * * ?")
public void jobDemo() {
log.info("Job开始");
}
@Override
public void afterPropertiesSet() throws Exception {
this.jobDemo();
}
}
3.系统启动后,按照定时时间自动跑job
quartz的使用
1.增加依赖
``
<!--quartz依赖-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</version>
</dependency>
2.配置Config
``
@Configuration
public class TestTaskConfiguration {
@Bean
public Scheduler scheduler() throws SchedulerException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//JobDetail:任务的细节
//newJob()--具体要执行的任务,通过一个任务类来给定
//withIdentity()--给任务一个标识,任务的名字和任务分组的名字
JobDetail oneJob = JobBuilder.newJob(TestTask.class)
.withIdentity("task1", "group1")
.build();
//用于构建任务执行的触发条件
TriggerBuilder<Trigger> newTrigger = TriggerBuilder.newTrigger();
//触发器的标识,包括触发器的名字和分组
newTrigger.withIdentity("trigger1", "group1");
//通过Cron表达式来指定要执行任务的时间和间隔
newTrigger.withSchedule(CronScheduleBuilder.cronSchedule("0/4 * * * * ?"));
Trigger oneTrigger = newTrigger.build();
scheduler.scheduleJob(oneJob, oneTrigger);
scheduler.start();
//避免控制台被干扰,这里先把任务停止了!
scheduler.shutdown();
return scheduler;
}
}
3.具体任务配置
/**
* 这个就是具体要执行的任务操作
*/
@Slf4j
public class TestTask implements Job, InitializingBean {
/**
* 在这个方法中写具体要执行的任务
*
* @param jobExecutionContext
* @throws JobExecutionException
*/
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info("定时任务执行了...");
}
@Override
public void afterPropertiesSet() throws Exception {
}
}
tips:个人小小的总结,如果有误或补充,请评论提出修改。
上一篇: 工厂模式
下一篇: 深入Mysql字符集设置分析_MySQL