springboot+task整合(定时任务)

1.使用springboot自带的定时任务需要在启动类上添加注解

复制代码
@EnableAsync        // 启用异步任务
@EnableScheduling   // 启用定时任务

2.如果是异步定时任务则需要配置线程池

复制代码
/**
 * 定义异步任务执行的线程池
 */
@Configuration
public class TaskPoolConfig {
    @Bean("asyncExecutor1")
    public Executor taskExecutor1 () {

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数10:线程池创建时候初始化的线程数
        executor.setCorePoolSize(10);
        // 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
        executor.setMaxPoolSize(20);
        // 缓冲队列200:用来缓冲执行任务的队列
        executor.setQueueCapacity(200);
        // 允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        executor.setKeepAliveSeconds(60);
        // 线程池名的前缀:设置好了之后可以方便定位处理任务所在的线程池
        executor.setThreadNamePrefix("asyncTask1-");
        /*
        线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,
        当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;
        如果执行程序已关闭,则会丢弃该任务
         */
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
        executor.setAwaitTerminationSeconds(600);
        return executor;
    }
}

3 .异步定时任务示例

复制代码
@Component
public class AsyncTask {
    private static final Logger LOGGER = LoggerFactory.getLogger(AsyncTask.class) ;
    // 只配置了一个 asyncExecutor1 不指定也会默认使用
    @Async
    public void asyncTask0 () {
        try{
            Thread.sleep(6000);
        }catch (Exception e){
            e.printStackTrace();
        }
        LOGGER.info("======异步任务结束1======");
    }
    @Async("asyncExecutor1")
    public void asyncTask1 () {
        try{
            Thread.sleep(5000);
        }catch (Exception e){
            e.printStackTrace();
        }
        LOGGER.info("======异步任务结束2======");
    }
}

4.异步定时任务测试

复制代码
@RestController
public class TaskController {
    @Resource
    private AsyncTask asyncTask ;
    @RequestMapping("/asyncTask")
    public String asyncTask (){
        asyncTask.asyncTask0();
        asyncTask.asyncTask1();
        return "成功" ;
    }
}

5.时间定时任务:

使用@Scheduled开启定时任务,可以通过内置的属性来指定执行的时间规则,也可以使用CRON表达式

复制代码
/**
 * 时间定时任务
 */
@Component
public class TimeTask {
    Logger LOG = LoggerFactory.getLogger(TimeTask.class.getName()) ;
    private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
    
    /**
     * 每6秒打印一次系统时间
     */
    @Scheduled(fixedDelay = 6000)
    public void systemDate (){
        LOG.info("当前时间::::"+format.format(new Date()));
    }

    /*
     * @Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
     * @Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
     * @Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
     * @Scheduled(cron="/5") :通过cron表达式定义规则
     */
}
相关推荐
DougLiang38 分钟前
关于easyexcel动态下拉选问题处理
java·开发语言
mochensage1 小时前
C++信息学竞赛中常用函数的一般用法
java·c++·算法
烛阴1 小时前
bignumber.js深度解析:驾驭任意精度计算的终极武器
前端·javascript·后端
计蒙不吃鱼1 小时前
一篇文章实现Android图片拼接并保存至相册
android·java·前端
服务端技术栈1 小时前
电商营销系统中的幂等性设计:从抽奖积分发放谈起
后端
小海编码日记1 小时前
Java八股-JVM & GC
java
全职计算机毕业设计1 小时前
基于Java Web的校园失物招领平台设计与实现
java·开发语言·前端
东阳马生架构1 小时前
商品中心—1.B端建品和C端缓存的技术文档
java
Chan161 小时前
【 SpringCloud | 微服务 MQ基础 】
java·spring·spring cloud·微服务·云原生·rabbitmq
LucianaiB2 小时前
如何做好一份优秀的技术文档:专业指南与最佳实践
android·java·数据库