springboot整合quartz

springboot整合quartz

起男 57 2025-04-11

springboot整合quartz

导入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
            <version>3.4.4</version>
        </dependency>

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
    </dependencies>

配置

配置文件

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo
    password: 123456
    username: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  quartz:
    job-store-type: jdbc 
    jdbc:
      initialize-schema: never 

配置类

@Configuration
public class QuartzConfig {

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setDataSource(dataSource);//设置数据源
        factory.setQuartzProperties(quartzProperties());//设置参数
        factory.setWaitForJobsToCompleteOnShutdown(true);
        return factory;
    }

    public Properties quartzProperties(){
        Properties properties = new Properties();
        properties.setProperty("org.quartz.jobStore.class","org.springframework.scheduling.quartz.LocalDataSourceJobStore");//将spring数据源交给quartz
        properties.setProperty("org.quartz.jobStore.tablePrefix","QRTZ_");//表的前缀
        properties.setProperty("org.quartz.jobStore.isClustered","true");//集群模式
        properties.setProperty("org.quartz.jobStore.acquireTriggersWithinLock","true");//获取trigger的时候加锁
        return properties;
    }
}

任务

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("running at "+new Date());
    }
}

使用

简单实现一个任务的添加和删除

@Service
@RequiredArgsConstructor
public class JobService {

    private final Scheduler scheduler;

    @SneakyThrows
    public void scheduleJob(){
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                .withIdentity(new JobKey("j1", "g1"))
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(new TriggerKey("j1", "g1"))
                .withSchedule(SimpleScheduleBuilder
                        .simpleSchedule()
                        .withIntervalInSeconds(2)
                        .repeatForever())
                .build();

        scheduler.scheduleJob(jobDetail,trigger);
    }

    @SneakyThrows
    public void removeJob() {
        scheduler.deleteJob(new JobKey("j1", "g1"));
    }
}

监听器

//监听任务,也可以使用其他监听器,以监听触发器和调度器
public class MyListener implements JobListener {
    @Override
    public String getName() {
        return "myListener";
    }

    @Override
    public void jobToBeExecuted(JobExecutionContext jobExecutionContext) {
        System.out.println("即将执行");
    }

    @Override
    public void jobExecutionVetoed(JobExecutionContext jobExecutionContext) {
        System.out.println("是否可以执行");
    }

    @Override
    public void jobWasExecuted(JobExecutionContext jobExecutionContext, JobExecutionException e) {
        System.out.println("已经执行");
    }
}

配置

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setDataSource(dataSource);
        factory.setQuartzProperties(quartzProperties());
        factory.setWaitForJobsToCompleteOnShutdown(true);
        factory.setGlobalJobListeners(new MyListener());//配置监听器
        return factory;
    }