c语言编程笔录

首页 >   > 笔记大全

笔记大全

SpringBoot动态定时任务如何实现

更新时间:2023-12-17

什么是动态定时任务

动态定时任务是指用户可以自定义定时任务的时间和执行逻辑,而不需要在代码中进行硬编码。在实际生产环境中,我们常常遇到需要动态添加定时任务的场景,如定时拉取某个接口的数据、定时生成某个报表等,如果每次都需要手动添加定时任务,这无疑会给工作带来很大的负担,因此动态定时任务显得非常重要。

动态定时任务的实现方式

其实实现动态定时任务的方式有很多,这里我们介绍一种基于SpringBoot和Quartz的实现方式。Quartz是一个功能强大的、开源的调度框架,可以实现高效、灵活的定时任务调度。以下是实现动态定时任务的具体步骤:

第一步:在pom.xml文件中添加quartz和spring-boot-starter-quartz的依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.3.0</version>
    </dependency>

第二步:在application.yml文件中配置Quartz的相关属性

spring:
  quartz:
    job-store-type: jdbc
    properties:
      org:
        quartz:
          scheduler:
            instance-id: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            tablePrefix: QRTZ_
            isClustered: true
            clusterCheckinInterval: 20000
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5 

第三步:实现动态创建定时任务的接口和相关业务逻辑

/**
 * 定时任务管理接口
 */
public interface QuartzJobManager {
    void addJob(QuartzJobDTO jobDTO);
    void pauseJob(QuartzJobDTO jobDTO);
    void resumeJob(QuartzJobDTO jobDTO);
    void deleteJob(QuartzJobDTO jobDTO);
}

@Service
public class QuartzJobManagerImpl implements QuartzJobManager {

    @Autowired
    private Scheduler scheduler;

    /**
     * 添加定时任务
     * @param jobDTO
     */
    @Override
    public void addJob(QuartzJobDTO jobDTO) {
        try {
            JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                    .withIdentity(jobDTO.getJobName(), jobDTO.getJobGroup())
                    .build();

            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobDTO.getCron());
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withSchedule(cronScheduleBuilder)
                    .withIdentity(jobDTO.getTriggerName(), jobDTO.getJobGroup())
                    .build();

            scheduler.scheduleJob(jobDetail, trigger);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 暂停定时任务
     * @param jobDTO
     */
    @Override
    public void pauseJob(QuartzJobDTO jobDTO) {
        try {
            JobKey jobKey = JobKey.jobKey(jobDTO.getJobName(), jobDTO.getJobGroup());
            scheduler.pauseJob(jobKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 恢复定时任务
     * @param jobDTO
     */
    @Override
    public void resumeJob(QuartzJobDTO jobDTO) {
        try {
            JobKey jobKey = JobKey.jobKey(jobDTO.getJobName(), jobDTO.getJobGroup());
            scheduler.resumeJob(jobKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除定时任务
     * @param jobDTO
     */
    @Override
    public void deleteJob(QuartzJobDTO jobDTO) {
        try {
            JobKey jobKey = JobKey.jobKey(jobDTO.getJobName(), jobDTO.getJobGroup());
            scheduler.deleteJob(jobKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

第四步:实现具体定时任务

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        // do something
    }
}

总结

动态定时任务是实际项目中非常重要的一部分,能够充分提升开发人员的工作效率和项目的可维护性。在本文中,我们简单介绍了一种基于SpringBoot和Quartz的实现方式,具体实现包括配置quartz的相关属性、实现动态创建定时任务的接口和相关的业务逻辑、实现具体定时任务等。希望读者能够在实际项目中灵活运用这些技术,提高工作效率,同时也欢迎读者提出宝贵意见和建议,不断完善和改进本文内容。