欢迎访问宙启技术站
智能推送

如何实现Springboot集成任务调度

发布时间:2023-05-16 15:54:47

Spring Boot是一种快速开发的框架,其优点在于程序的结构清晰可读,且整个程序都处于容器环境中,保证了程序的稳定性。任务调度是企业级应用中必不可少的一部分,因此,如何将任务调度与Spring Boot 集成起来是一个值得探讨的话题。

本文将以 Quartz 作为任务调度框架,并介绍如何将 Quartz 与 Spring Boot 集成起来,实现一个简单的任务调度应用。

步骤1:添加 Quartz 依赖

在 pom.xml 文件中添加 Quartz 的依赖:

<dependency>
   <groupId>org.quartz-scheduler</groupId>
   <artifactId>quartz</artifactId>
   <version>2.3.2</version>
</dependency>

依赖添加完成后,运行 mvn clean install 命令,从 Maven 仓库下载依赖。

步骤2:创建 Quartz 任务

Quartz任务类需要实现 Job 接口,并且重写 execute() 方法。在 execute() 方法中编写需要执行的任务。

@Component
public class SimpleJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("开始执行定时任务:" + new Date());
    }
}

步骤3:配置 Quartz 定时任务

在 Spring Boot 项目中,可通过配置文件方式来创建 Quartz 定时任务。

首先,在 application.properties 文件中配置 Quartz。

# 配置 Quartz 调度器
quartz.scheduler.instanceName = MyScheduler
quartz.scheduler.instanceId = AUTO
quartz.scheduler.skipUpdateCheck = true
# 配置任务存储方式
quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
quartz.jobStore.dataSource = myDS
quartz.jobStore.tablePrefix = QRTZ_
quartz.jobStore.isClustered = false
# 配置数据源
quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/quartz
quartz.dataSource.myDS.user = root
quartz.dataSource.myDS.password = admin123
quartz.dataSource.myDS.maxConnections = 10

接下来,创建 TaskConfig 类。

@Configuration
public class TaskConfig {

    @Autowired
    private DataSource dataSource;

    @Autowired
    private SimpleJob simpleJob;

    @Bean
    public JobDetail jobDetail() {
        return JobBuilder.newJob(simpleJob.getClass())
                .withIdentity("simpleJob")
                .usingJobData("name", "test")
                .storeDurably().build();
    }

    @Bean
    public Trigger trigger() {
        SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(5)
                .repeatForever();
        return TriggerBuilder.newTrigger()
                .forJob(jobDetail())
                .withIdentity("simpleTrigger")
                .usingJobData("age", 26)
                .withSchedule(builder)
                .build();
    }

    @Bean
    public SchedulerFactoryBean schedulerFactory() {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        bean.setDataSource(dataSource);
        bean.setJobFactory(jobFactory());
        bean.setTriggers(trigger());
        return bean;
    }

    @Bean
    public SpringBeanJobFactory jobFactory() {
        return new SpringBeanJobFactory();
    }
}

在 TaskConfig 类中,首先使用 @Autowired 自动注入了 DataSource 和 SimpleJob。再通过 @Bean 注解的方式创建了 JobDetail、Trigger 和 SchedulerFactoryBean 对象。JobDetail 对象中,任务名称为 simpleJob,JobData 中设置了名称为 test 的参数;Trigger 对象中,任务的调度策略为每 5 秒执行一次;SchedulerFactoryBean 对象中,设置了数据源、JobFactory 和Trigger。

步骤4:启动定时任务

在 Spring Boot 项目的启动类中,注入 SchedulerFactoryBean 实例,并调用 scheduler.start() 方法,启动定时任务。

@SpringBootApplication
public class Application implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Autowired
    private SchedulerFactoryBean schedulerFactory;

    @Override
    public void run(String... args) throws Exception {
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.start();
    }
}

运行 Spring Boot 项目,即可在控制台中看到输出信息,每隔 5 秒钟输出一条信息。

至此,Spring Boot 集成 Quartz 定时任务的实现,就完成了。