springboot schedule动态实现_基于Spring Boot实现定时任务的动态增删启停

37117ca1120c4ea6de753e7f6ccad11b.png

今天跟大家分享基于Spring Boot实现定时任务的动态增删启停 的 知识。

1 基于Spring Boot实现定时任务的动态增删启停

在spring boot项目中,可以通过@EnableScheduling注解和@Scheduled注解实现定时任务,也可以通过SchedulingConfigurer接口来实现定时任务。但是这两种方式不能动态添加、删除、启动、停止任务。

要实现动态增删启停定时任务功能,比较广泛的做法是集成Quartz框架。但是本人的开发原则是:在满足项目需求的情况下,尽量少的依赖其它框架,避免项目过于臃肿和复杂。

查看spring-context这个jar包中org.springframework.scheduling.ScheduledTaskRegistrar这个类的源代码,发现可以通过改造这个类就能实现动态增删启停定时任务功能。

4c7081a25071ae97d99ae629cbde8cce.png

定时任务列表页

52a1132f6bedd39bd49163a5e6b0f383.png

定时任务执行日志

添加执行定时任务的线程池配置类

@Configurationpublic class SchedulingConfig {
        @Bean    public TaskScheduler taskScheduler() {
            ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();        // 定时任务执行线程池核心线程数        taskScheduler.setPoolSize(4);        taskScheduler.setRemoveOnCancelPolicy(true);        taskScheduler.setThreadNamePrefix("TaskSchedulerThreadPool-");        return taskScheduler;    }}

添加ScheduledFuture的包装类。ScheduledFuture是ScheduledExecutorService定时任务线程池的执行结果。

public final class ScheduledTask {
        volatile ScheduledFuture> future;    /**     * 取消定时任务     */    public void cancel() {
            ScheduledFuture> future = this.future;        if (future != null) {
                future.cancel(true);        }    }}

添加Runnable接口实现类,被定时任务线程池调用,用来执行指定bean里面的方法。

public class SchedulingRunnable implements Runnable {
        private static final Logger logger = LoggerFactory.getLogger(SchedulingRunnable.class);    private String beanName;    private String methodName;    private String params;    public SchedulingRunnable(String beanName, String methodName) {
            this(beanName, methodName, null);    }    public SchedulingRunnable(String beanName, String methodName, String params) {
            this.beanName = beanName;        this.methodName = methodName;        this.params = params;    }    @Override    public void run() {
            logger.info("定时任务开始执行 - bean:{},方法:{},参数:{}", beanName, methodName, params);        long startTime = System.currentTimeMillis();        try {
         
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,可以使用Spring自带的`@Scheduled`注解来实现定时任务。但是默认情况下,这些定时任务是在应用启动时就会被注册和执行的,无法动态地注册、删除、修改、添加。 为了实现定时任务动态管理,可以借助Quartz等第三方定时任务框架。下面是一种实现方案: 1. 引入Quartz依赖 在pom.xml中添加Quartz的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 2. 配置Quartz定时任务 创建一个`QuartzConfig`类,配置Quartz的相关参数和实例化`Scheduler`对象: ```java @Configuration public class QuartzConfig { @Bean public Scheduler scheduler() throws SchedulerException { SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.start(); return scheduler; } } ``` 3. 创建定时任务 创建一个`Job`类,实现`org.quartz.Job`接口,并重写`execute`方法,定义具体的定时任务逻辑: ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 定时任务逻辑 } } ``` 4. 注册定时任务 在需要注册定时任务的地方,获取`Scheduler`对象,并创建一个`JobDetail`和`Trigger`对象,将其注册到`Scheduler`中: ```java @Autowired private Scheduler scheduler; public void registerJob() throws SchedulerException { JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity("jobId", "groupName") .build(); Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("triggerId","groupName") .startNow() .withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ?")) .build(); scheduler.scheduleJob(jobDetail, trigger); } ``` 5. 实现动态管理 可以通过编程的方式,动态修改、删除、添加定时任务。例如,可以通过`scheduler.deleteJob`方法删除已注册的定时任务;通过`JobBuilder.newJob`方法重新创建一个`JobDetail`,将其注册到`Scheduler`中实现修改或添加定时任务。 通过以上步骤的配置和实现,就可以在Spring Boot动态地注册、删除、修改、添加定时任务了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值