SpringBoot中定时任务与异步定时任务的实现

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 SpringBoot中定时任务与异步定时任务的实现,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

场景

若依前后端分离版手把手教你本地搭建环境并运行项目:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662

在上面实现项目搭建的基础上,怎样在SpringBoot中实现定时任务与异步定时任务实现。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

定时任务实现

新建一个类,类上添加

@Component
@EnableScheduling

注解开启定时任务支持。

然后类中新建方法,使用

@Scheduled(fixedRateString = "1000")

来标识定时任务执行的方法。

这里使用fixedRateString是因为这样可以通过

@Scheduled(fixedRateString = "${scheduled.WebRedisPT}")

这种类似的方式可以从配置文件中读取配置的定时任务执行的频率。

然后不使用cron表达式方式执行定时任务方法,是因为这样可以设置定时任务的方法

在一秒内执行多次,这里是1000代表一秒执行1次,如果是500则代表一秒执行2次。

示例代码

package com.ruoyi.web.asyncTask;

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;

@Component
@EnableScheduling
public class TaskDemo {

    private SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSS");

    @Scheduled(fixedRateString = "1000")
    public void taskOne() {
        System.out.println("任务1执行开始时间"+ dateFormat.format(System.currentTimeMillis()));
        System.out.println("公众号:霸道的程序猿");
        System.out.println("任务1执行结束时间"+ dateFormat.format(System.currentTimeMillis()));
    }

}

执行效果

 

SpringBoot中定时任务与异步定时任务的实现

异步定时任务执行

当一个系统中需要执行的定时任务比较多且每个任务执行的频率比较快时,如果还是用上面那种方式去实现所有定时任务的话,就会出现线程拥堵、定时任务在指定的时间内执行不完的情况,这时候就得需要异步任务的执行。

首先新建一个配置类来开启异步定时任务的支持

package com.ruoyi.web.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@EnableAsync
public class ExecutorConfig {

    private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);

    @Bean
    public Executor asyncServiceExecutor() {
        logger.info("start asyncServiceExecutor");
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //配置核心线程数
        executor.setCorePoolSize(32);
        //配置最大线程数
        executor.setMaxPoolSize(60);
        //配置队列大小
        executor.setQueueCapacity(99999);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("async-service-");

        // rejection-policy:当pool已经达到max size的时候,如何处理新任务
        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //执行初始化
        executor.initialize();
        return executor;
    }
}

这里的核心线程数和最大线程数根据自己业务需要和服务器配置自行修改。

然后再新建一个定时任务执行类,除了添加

@Component
@EnableScheduling

在类上以及添加

@Scheduled(fixedRateString = "500")

还要在方法上添加

@Async("asyncServiceExecutor")

开始异步定时任务的支持

完整示例代码

package com.ruoyi.web.asyncTask;

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class asyncTaskDemo {

    @Scheduled(fixedRateString = "500")
    @Async("asyncServiceExecutor")
    public void taskOne() {
        System.out.println("异步定时任务执行");
    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136338.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!