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

springboot整合quartz

程序员文章站 2022-06-01 13:37:58
...

前言

在上一篇中,我们了解了quartz的基本使用,在项目中与springboot的整合是比较常见的方式,下面让我们来看看如何在springboot中集成quartz吧

1、引入pom

		<!--spring boot集成quartz-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

2、配置文件无需做太多配置

server.port=8088

3、编写quartz.config类

通过上一篇的quartz的基本使用我们了解到,quartz的运行其实就是3部分,trigger,jobDetail和scheduler,将他们组装起来就可以运行起来

在quartz.config中,trigger和jobDetail以bean的形式注入到spring容器中,然后再通过scheduler的相关API进行调用即可

@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail myJobDetail(){
        JobDetail jobDetail = JobBuilder
                .newJob(MyQuartzJob.class)
                .withIdentity("myQuartzJob", "group1")
                .storeDurably()
                .build();
        return jobDetail;
    }

    @Bean
    public Trigger myTrigger(){
        Trigger trigger = TriggerBuilder.newTrigger()
                .startNow()
                .withIdentity("myTrigger","group1")
                .forJob(myJobDetail())
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()
                ).build();
        return trigger;
    }

}

可以发现,其实就是上一篇中的代码抽取

4、编写一scheduler的调度类

该类提供一些常用的方法,比如启动任务,暂停任务,恢复任务等操作

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyQuartzScheduler {

    // 任务调度
    @Autowired
    private Scheduler scheduler;

    /**
     * 开始执行所有任务
     *
     * @throws SchedulerException
     */
    public void startJob() throws SchedulerException {
        scheduler.start();
    }

}

5、提供一个监听器的类,用于项目启动时候调取任务


import com.congge.scheduler.MyQuartzScheduler;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;

@Configuration
@Slf4j
public class DoJobScheduler implements ApplicationListener<ContextRefreshedEvent> {

    @Autowired
    private MyQuartzScheduler myQuartzScheduler;

    @SneakyThrows
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        myQuartzScheduler.startJob();
        System.out.println("任务启动...");
    }

    /**
     * 注入scheduler
     *
     * @return
     * @throws SchedulerException
     */
    @Bean
    public Scheduler scheduler() throws SchedulerException {
        SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
        return schedulerFactoryBean.getScheduler();
    }
}

最后别忘了最基本的job类,

@Slf4j
public class MyQuartzJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        LocalTime now = LocalTime.now();
        log.info(now.toString() + ":开始执行job");
    }
}

启动项目,观察控制台效果,到这里,我们的整合就基本完成了
springboot整合quartz

最后要说一个问题就是,在实际开发中,由于quartz不是分布式任务调度框架,因此如果是分布式部署的话,最最好配置分布式锁一起使用,小编在项目中配合zookeeper锁一起使用

坑点

在trigger的配置的地方一定要加上下面这句,否则会下面这个错
springboot整合quartz
springboot整合quartz

关于springboot和quartz的整合,网上的可参考的资料提到的整合方式有很多,也比较灵活,大家找一种适合自己的比较简单的方式即可,本篇到此结束,最后感谢观看!