当前位置: 首页 > news >正文

springboot 定时任务基础模板

springboot 如何开启定时任务

基础版本

一、在启动类上面加上 @EnableScheduling 即可开启定时
@SpringBootApplication
@EnableAsync
@EnableScheduling
public class ScheduleApplication {

    public static void main(String[] args) {
        SpringApplication.run(ScheduleApplication .class, args);
    }
}
二、创建定时任务类
@Component
@Slf4j
public class WorkbenchProgressStatJob {


    @Autowired
    WorkbenchProgressService workbenchProgressService;


    @Scheduled(cron = "0 0 9,12,18 * * ?")
    @Transactional(rollbackFor = Exception.class)
    public void doStatJob()  {

        log.info("===============  WorkbenchProgressStatJob start at {} ===============", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
        
        log.info("===============  WorkbenchProgressStatJob end at {} ===============", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
    }
}

我这里演示的是每天 9点、12点、18点执行一次任务,所以 在 @Scheduler注解里面使用了 cron表达式
0 0 9,12,18 * * ?

这里看到的 @Scheduled注解,不止可以用cron参数 也可以使用 fixedDelay() 或者 fixedRate() 参数,

fixedDelay() : 以固定时间间隔来分割上一次任务执行和下一次任务执行。 也就是上一次任务执行完成之后,开始计算时间,时间达到设置的数字, 开始下一次任务执行。 毫秒为单位

fixedRate(): 以固定时间间隔来分割每一次的任务调用,这里和上一个有区别的地方是,他不会等到上一次任务执行结束才开始计算时间, 而是上一次任务执行开始,就开始计算。 如果任务执行耗时比较长,设置的时间间隔比较短,那么可能上一次还没执行玩,第二次已经开始。

多线程进阶版

前面的基础版本是单线程,如果有多个定时任务,其中一个任务耗时比较长,那么其他的任务就会被卡住,可能无法达到预期的定时执行的效果。
这个时候,给任务加上多线程,就能避免这个问题了。

新增多线程配置类
@Configuration
@EnableAsync
public class ExecutorConfig {

    @Bean("taskExecutor")
    public Executor taskExecutor(){
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(10);
        taskExecutor.setMaxPoolSize(20);
        taskExecutor.setQueueCapacity(20);
        taskExecutor.setKeepAliveSeconds(60);
        taskExecutor.setThreadNamePrefix("taskExecutor-schedule-");
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(60);
        return taskExecutor;
    }
}
在定时任务上添加注解 @Async
    @Scheduled(fixedDelay = 1000)
    @Async
    @Transactional(rollbackFor = Exception.class)
    public void doStatJob1() throws InterruptedException {
        log.info("doStatJob1 start");
        Thread.sleep(10000);
        log.info("doStatJob1 end");
    }

这样这个定时任务会提交到线程池中去执行,如果有多个一样的任务同事执行,只要没有把线程池占慢 都可以执行下去。
如果每个定时任务都想多线程执行,那么直接将 @Async注解提取到 定时任务配置类的类上面去就可以了。

模拟测试

基础版:

	 @Scheduled(fixedDelay = 1000)
    @Transactional(rollbackFor = Exception.class)
    public void doStatJob1() throws InterruptedException {
        log.info("doStatJob1 start");
        Thread.sleep(10000);
        log.info("doStatJob1 end");
    }


    @Scheduled(fixedDelay = 1000)
    @Transactional(rollbackFor = Exception.class)
    public void doStatJob2() throws InterruptedException {
        log.info("doStatJob2 start");
        Thread.sleep(10000);
        log.info("doStatJob2 end");
    }

结果:
在这里插入图片描述

多线程版:

    @Scheduled(fixedDelay = 1000)
    @Async
    @Transactional(rollbackFor = Exception.class)
    public void doStatJob1() throws InterruptedException {
        log.info("doStatJob1 start");
        Thread.sleep(10000);
        log.info("doStatJob1 end");
    }


    @Scheduled(fixedDelay = 1000)
    @Async
    @Transactional(rollbackFor = Exception.class)
    public void doStatJob2() throws InterruptedException {
        log.info("doStatJob2 start");
        Thread.sleep(10000);
        log.info("doStatJob2 end");
    }

结果:
在这里插入图片描述

相关文章:

  • zabbix添加一个ubuntu受监控主机
  • Android8.1下拉状态栏菜单和系统设置添加触摸开关功能
  • Java HashSet
  • 青少年等级考试【Python通关干货知识点】(一级)
  • MongoDB在Java中的使用
  • 简单阐述对称加密算法和非对称加密算法(附C++示例代码,以openssl实现AES、DES、RSA、ECC、DSA算法加密)
  • 理解操作系统(Linux)
  • django logging的StreamHandler的一个小用法
  • IJCAI-2022 多级发射方法的脉冲神经网络
  • Spring中自定义事件监听
  • 工具(二):Nginx 扩展 OpenResty
  • css:隐藏input file标签并触发点击上传文件事件
  • EMQX Cloud 自定义函数实现多种 IoT 数据形式的灵活转化
  • 黑盒测试用例设计 - 场景法
  • 51单片机实训day2——创建Proteus工程以及Proteus基本控件的使用|单片机最小系统电路设计:电源配置 复位电路 晶振电路
  • 《Python多人游戏项目实战》第五节 断线重连
  • Oracle --- 序列
  • pdf文档页码怎么添加?分享这几个pdf加页码方法给你
  • Java 线程的六种状态及其简易转换
  • 【Python】用python将html转化为pdf