基于spring的定时任务的实现

本文介绍了基于Spring的定时任务实现方法,包括@Scheduled注解的使用,如fixedRate、fixedDelay和cron表达式的区别。当面临任务并发执行时,通过@Async和@EnableAsync开启异步,利用线程池避免阻塞。此外,还提及了更高级的定时任务框架,如Quartz和xxl-job,选择取决于具体业务需求。

一、直接通过@Scheduled来实现

@Configuration
@EnableScheduling
public class TaskTimingJob {

    @Scheduled(fixedDelay=60000)
    private void configureTasks() {
        // todo
    }
}

@Scheduled主要的四个参数说明如下:

1、fixedRate是指上一次任务的开始时间到下一次任务的开始时间的间隔,如果阻塞会记录需要执行的次数,通畅后全部会执行。
2、fixedDelay是指了上一次任务的结束时间到下一次任务的开始时间的间隔,如果阻塞会记录需要执行的次数,通畅后全部会执行。
3、cron表达式和fixedRate有点相似,指在哪一刻执行任务,会在配置的任务开始时间判断任务是否可以执行,如果能则执行,不能则会跳过本次执行。
4、如果是强调任务间隔的定时任务,建议使用fixedRate和fixedDelay,如果是强调任务在某时某分某刻执行的定时任务,建议使用cron表达式。

注意:这种方式实现的定时任务当同一时刻有多个任务需要执行,会发生阻塞,即是单线程串行的执行方式,要避免这种情况就要加上注解@Async并且在springboot主类上加@EnableAsync开启异步,这样会默认使用自带的线程池,当然也可以使用自定义的,如下:

先配置好线程池

 @Configuration
   pbulic class PoolConfig {

        @Bean("taskPool")
        public Executor taskPoolExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(10);
            executor.setMaxPoolSize(20);
            executor.setQueueCapacity(200);
            executor.setKeepAliveSeconds(60);
            executor.setThreadNamePrefix("taskPoolExecutor-");
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            return executor;
        }
    }

然后在定时任务中加上@Async(“taskPool”)

@Configuration
@EnableScheduling
public class TaskTimingJob {

    @Scheduled(fixedDelay=60000)
    @Async(“taskPool”)
    private void configureTasks() {
        // todo
    }
}

二、通过实现SchedulingConfigurer接口

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // 自己定义线程池
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
    }
}

然后再写定时任务

@Component
public class TaskTimingJob {

    @Scheduled(fixedDelay=60000)
    private void configureTasks() {
        // todo
    }
}

结语:还有更加灵活的定时任务框架quartz,分布式定时任务框架xxl-job等,具体的技术选型根据自身业务即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值