欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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:个人小小的总结,如果有误或补充,请评论提出修改。

相关标签: java小知识 java