springboot使用@Scheduled定义定时任务

前言

之前遇到需要定时任务的需求时,我一般是选择通过java的Timer或是第三方的Quartz来进行实现
但是使用起来也是比较麻烦的,直到最近发现还可以去使用Springboot中的@Scheduled来解决问题,就十分方便了(当然spring中也可以使用,但如果不是springboot需要写一些xml文件的配置,也没有那么方便了)

下面具体说一下实现步骤

具体实现

1.启动类

首先需要在启动类上添加注解@EnableScheduling来开启定时任务

@SpringBootApplication
@EnableTransactionManagement
@EnableScheduling
public class SmartSchoolApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(SmartSchoolApplication.class, args);
    }
}

2.类中方法

然后就是需要在类中需要定时任务的方法上添加注解@Scheduled
注意:类上要有@Component/@Controller等会将类标识spring可以识别的注解

@Component
public class TestSchedule {
    @Scheduled(fixedDelay = 1000 ) //每一秒运行一次
    public void printDate(){
        System.out.println(new Date().toLocaleString());
    }
}

在上述例子中是通过@Scheduled注解中的fixedDelay参数来实现的,但其实@Scheduled注解中有很多参数可以来定义定时参数

  1. fixedDelay:指定两次任务执行的时间间隔(毫秒),此时间间隔指的是,前一次任务结束与下一个任务开始的间隔。如:@Scheduled(fixedDelay = 5*1000 ),表示第一个任务结束后,过5秒后,开始第二个任务。

  2. fixedRate:指定两次任务执行的时间间隔(毫秒),此时间间隔指的是,前一个任务开始与下一个任务开始的间隔。如:@Scheduled(fixedRate= 5*1000 ),表示第一个任务开始后(第一个任务执行时间小于5秒),第一个任务开始后的第6秒,开始第二个任务。如果第一个任务执行时间大于5秒,第一个任务结束后,直接开始第二个任务。

  3. cron:使用表达是进行任务的执行,例如:@Scheduled(cron = "0/15 * * * * ? ")每隔15秒执行一次

我一般都是采用cron表达式的方式来进行定时,相信大家用的也不少,具体就不再赘述,百度一下可以在线根据你想要的时间来生成cron表达式

其实这时基本已经可以使用定时任务了,但是使用中可能还会遇到一个问题,这时你所有的定时任务使用的是统一线程

3.线程池

增加如下配置就设置了线程池的大小,可以根据项目的定时任务多少进行配置,这样的话,定时任务之间就不会相互影响

@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
 
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    }
 
    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(10); //指定线程池大小
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值