zoukankan      html  css  js  c++  java
  • Spring Boot 内置定时器的使用

    定时器又叫定时任务、计划任务,在项目开发中使用比较普遍,它能够定时执行规定的任务,例如:订单到期处理、会员到期处理、数据报表生成等

    Springboot内置的定时任务  默认是单线程,使用非常方便,使用时要在Application中设置启用定时任务功能@EnableScheduling,代码如下:

    1.启用定时任务功能

    @SpringBootApplication
    @EnableScheduling
    @MapperScan("main.blog.mapper")
    
    public class BootApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(BootApplication.class, args);
        }
    }

    2.使用@Scheduled注解执行定时任务

    使用 @Scheduled来创建定时任务 这个注解用来标注一个定时任务方法。 
    通过看 @Scheduled源码可以看出它支持多种参数:
    (1).cron:cron表达式,指定任务在特定时间执行;
    (2).fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
    (3).fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
    (4).fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
    (5).fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
    (6).initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
    (7).initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
    (8).zone:时区,默认为当前时区,一般没有用到。

    单线程定时任务的使用,代码如下:

    package com.blog.controller;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Controller;
    
    @Controller("Task")
    public class TaskController
    {
        private static final Logger logger = LoggerFactory.getLogger(TaskController.class);
    
        private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy:mm:dd HH:mm:ss");
        
        /**
         * 方法一:cron方式,项目启动后每5秒执行一次
         * 
         * @auther huxiaoguang
         * @return void
         */
        @Scheduled(cron = "0/5 * * * * ?")
        public void cronTask() 
        {
            logger.info("Cron方式-定时任务执行时间:"+ dateFormat.format(new Date()));
        }
        
        /**
         * 方法二:fixedRate方式,上一次的开始时间与下一次的开始时间为基点,项目启动时会执行一次,然后每5秒执行一次
         * 
         * @auther huxiaoguang
         * @return void
         */
        @Scheduled(fixedRate = 5000)
        public void fixedRateTask()
        {
            logger.info("fixedRate方式-定时任务执行时间:"+ dateFormat.format(new Date()));
        }
        
        /**
         * 方法二:fixedRate方式,项目启动时2秒后会执行一次,然后每5秒执行一次
         * 
         * @auther huxiaoguang
         * @return void
         */
        @Scheduled(initialDelay = 2000,fixedRate = 5000)
        public void fixedRateInitialDelayTask() 
        {
            logger.info("initialDelay方式-定时任务执行时间:"+ dateFormat.format(new Date()));
        }
        
        /**
         * 方法三:fixedDelay方式,上一次的结束时间与下一次的开始时间为基点,项目启动时会执行一次,然后每5秒执行一次
         * 
         * @auther huxiaoguang
         * @return void
         */
        @Scheduled(fixedDelay = 5000)
        public void fixedDelayTask()
        {
            logger.info("fixedDelay方式-定时任务执行时间:"+ dateFormat.format(new Date()));
        }
        
        /**
         * 方法三:fixedDelay方式,项目启动时2秒后会执行一次,然后每5秒执行一次
         * 
         * @auther huxiaoguang
         * @return void
         */
        @Scheduled(initialDelay = 2000, fixedDelay = 5000)
        public void initialDelayFixedDelayTask() 
        {
          logger.info("initialDelay方式-定时任务执行时间:"+ dateFormat.format(new Date()));
        }
    }

    3.多线程定时任务的使用

    在config下新增配置文件SchedulerConfig.java ,配置自定义线程池,代码如下:

    @Configuration
    @EnableScheduling  //开启定时器
    public class SchedulerConfig implements SchedulingConfigurer {
    
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            //多线程配置
            scheduledTaskRegistrar.setScheduler(taskExecutor());
        }
    
        @Bean
        public Executor taskExecutor() {
            return Executors.newScheduledThreadPool(100);
        }
    }
    然后再用@Scheduled执行任务时,就已经是多线程任务啦。
  • 相关阅读:
    apns libcurl
    apns libcurl
    epoll
    epoll
    Linux服务器压测
    Linux服务器压测
    libevent
    libevent
    shell脚本
    shell脚本
  • 原文地址:https://www.cnblogs.com/huxiaoguang/p/10807295.html
Copyright © 2011-2022 走看看