SpringBoot 定时器总结

目录

基于@Scheduled的定时器

cron配置在类中

cron在配置文件中

cron配置在数据库中

支持动态修改cron的定时器(SchedulingConfigurer)


基于@Scheduled的定时器

这个很简单,使用和这个注解,配置一个cron表达式,在 主类中增加一个注@EnableScheduling

即可。

这种定时器 cron表达式位置不同,分成三种。

cron配置在类中

例如:

    @Scheduled(cron = "*/3 * * * * ?")
    public void demo2(){
        System.out.println("property cron test!");
    }

启动即可跑起来,问题就是修改cron必须重新编译。

cron在配置文件中

例如

    @Scheduled(cron = "${demo.test}")
    public void demo(){
        System.out.println("property cron test!");
    }

需要在配置文件中配置:

demo:
  test: '*/3 * * * * ?'

这种如果修改cron的话,不需要编译,但是如果需要cron生效的话,需要重启项目。

cron配置在数据库中

例如:

 @Scheduled(cron = "#{@getCron}")
    public void cancel() {
        cancelDetail();
    }

这里需要配置一个配置类,如下:

@Configuration
public class CronConfig {

    @Autowired
    private SystemSettingsDao systemSettingsDao;


    @Bean
    public String getCron() {
        return systemSettingsDao.getSystemSettings(
                "key").getPropertyValue();
    }
}

这样的话,在系统启动的时候就会去加载con表达式,好处就是我们可以把多个配置项目放到一个数据库表中,集中修改,缺点还是需要重启系统使得cron生效。

支持动态修改cron的定时器(SchedulingConfigurer)

具体实现方式如下:

定义一个定时器类TestSchedulerTask 实现接口 SchedulingConfigurer,实现其中configureTasks()方法,定义触发器,在每次执行后查询最新的cron,既可支持动态cron修改而不用重启系统。

如下:

package com.iflytek.cityinsuredmonitorreport.scheduler;

import com.iflytek.cityinsuredmonitorreport.dao.SystemSettingsDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.stereotype.Component;
import org.springframework.scheduling.support.CronTrigger;

import javax.annotation.PostConstruct;
import java.util.Date;

/**
 * @Program: 
 * @Description:
 * @Author: 
 * @Create: 2021-08-24 16:12
 */
@Component
@Lazy(value = false)
public class TestSchedulerTask implements SchedulingConfigurer {

    private static final Logger log = LoggerFactory.getLogger(TestSchedulerTask .class);

    private static String cron;

    @Autowired
    private SystemSettingsDao systemSettingsDao;

    @Autowired
    private  DutyService dutyService;

    //初始获取cron
    @PostConstruct
    public void cronInit() {
        cron = getCronValue();
        log.info("cron:{}", cron);
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(() -> {
            // 任务逻辑
            dutyService.handle();
        }, triggerContext -> {
            // 任务触发,可修改任务的执行周期
            cron = getCronValue();
            log.info("cron-new:{}", cron);
            CronTrigger trigger = new CronTrigger(cron);
            Date nextExec = trigger.nextExecutionTime(triggerContext);
            return nextExec;
        });
    }


    public String getCronValue() {
        return systemSettingsDao.getSystemSettings(
                "cron").getPropertyValue();
    }

}

上述案例中 cron也是从数据库中获取,还可以支持动态修改cron,还不用重启项目。奈斯!

参考博客:

https://blog.csdn.net/G0_hw/article/details/94877687

https://www.cnblogs.com/lyn20141231/p/12105211.html

https://www.cnblogs.com/mylbs123/p/12894823.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot定时器是一种可以在指定时间间隔内执行任务的功能。它可以使用`@EnableScheduling`注解来开启定时器功能,并且通过`@Scheduled`注解来指定任务的执行时间。 在Spring Boot项目中,可以创建一个定时任务配置类,使用`@Configuration`和`@EnableScheduling`注解来标识该类是一个配置类,并开启定时功能。然后,可以在该类中定义具体的定时任务方法,使用`@Scheduled`注解来指定任务的执行时间。比如,在给定的示例代码中,`SchedulingConfig`类中的`getToken()`方法被标记为定时任务,使用`@Scheduled(cron = "*/5 * * * * ?")`来指定每5秒执行一次。 另外,可以在定时任务方法中调用其他业务逻辑方法。例如,在给定的示例代码中,`getToken()`方法中调用了`testService.test("刚刚")`方法来执行具体的业务逻辑。 总结来说,Spring Boot定时器通过使用`@EnableScheduling`和`@Scheduled`注解来开启和指定定时任务的执行时间,可以执行一些需要在固定时间间隔内运行的任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Spring boot实现定时器](https://blog.csdn.net/qq_43799161/article/details/123502124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Springboot定时器](https://blog.csdn.net/xyy1028/article/details/80627155)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值