千家信息网

SpringBoot2如何使用定时任务和异步任务

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章给大家分享的是有关SpringBoot2如何使用定时任务和异步任务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、定时任务1、基本概念按照指定时间执行的程序。2、
千家信息网最后更新 2025年01月16日SpringBoot2如何使用定时任务和异步任务

这篇文章给大家分享的是有关SpringBoot2如何使用定时任务和异步任务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、定时任务

1、基本概念

按照指定时间执行的程序。

2、使用场景

数据分析数据清理系统服务监控

二、同步和异步

1、基本概念

  • 同步调用

程序按照代码顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;

  • 异步调用

顺序执行时,不等待异步调用的代码块返回结果就执行后面的程序。

2、使用场景

短信通知邮件发送批量数据入缓存

三、SpringBoot2使用定时器

1、定时器执行规则注解

@Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行@Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行@Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次@Scheduled(cron="/5") :通过cron表达式定义规则

2、定义时间打印定时器

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;import java.util.Date;/** * 时间定时任务 */@Componentpublic class TimeTask {    Logger LOG = LoggerFactory.getLogger(TimeTask.class.getName()) ;    private static final SimpleDateFormat format =            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;    /**     * 每3秒打印一次系统时间     */    @Scheduled(fixedDelay = 3000)    public void systemDate (){        LOG.info("当前时间::::"+format.format(new Date()));    }}

3、启动类开启定时器注解

@EnableScheduling   // 启用定时任务@SpringBootApplicationpublic class TaskApplication {    public static void main(String[] args) {        SpringApplication.run(TaskApplication.class,args) ;    }}

四、SpringBoot2.0使用异步任务

1、编写异步任务类

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Component;@Componentpublic class AsyncTask {    private static final Logger LOGGER = LoggerFactory.getLogger(AsyncTask.class) ;    /*     * [ asyncTask1-2] com.boot.task.config.AsyncTask : ======异步任务结束1======     * [ asyncTask1-1] com.boot.task.config.AsyncTask : ======异步任务结束0======     */    // 只配置了一个 asyncExecutor1 不指定也会默认使用    @Async    public void asyncTask0 () {        try{            Thread.sleep(5000);        }catch (Exception e){            e.printStackTrace();        }        LOGGER.info("======异步任务结束0======");    }    @Async("asyncExecutor1")    public void asyncTask1 () {        try{            Thread.sleep(5000);        }catch (Exception e){            e.printStackTrace();        }        LOGGER.info("======异步任务结束1======");    }}

2、指定异步任务执行的线程池

这里可以不指定,指定执行的线城池,可以更加方便的监控和管理异步任务的执行。

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;import java.util.concurrent.ThreadPoolExecutor;/** * 定义异步任务执行的线程池 */@Configurationpublic 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、启动类添加异步注解

@EnableAsync        // 启用异步任务@SpringBootApplicationpublic class TaskApplication {    public static void main(String[] args) {        SpringApplication.run(TaskApplication.class,args) ;    }}

4、异步调用的测试接口

@RestControllerpublic class TaskController {    @Resource    private AsyncTask asyncTask ;    @RequestMapping("/asyncTask")    public String asyncTask (){        asyncTask.asyncTask0();        asyncTask.asyncTask1();        return "success" ;    }}

感谢各位的阅读!关于"SpringBoot2如何使用定时任务和异步任务"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

任务 线程 时间 程序 定时器 时候 数据 核心 注解 策略 规则 队列 处理 缓冲 最大 一行 代码 内容 场景 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 腾讯金融云满足网络安全法吗 如何把网页内容放入数据库 你对软件开发的理解 互联网科技企业文化墙 104规约是客户端连服务器吗 数据库外链接语法 小学生网络安全现状调研问卷 山海经异兽录服务器冠名 数据库技术用于 山东省图书馆数据库登录 逊克软件开发工具 网络安全初学者课程 免费sql数据库 维护网络安全有哪些任务 保定盘古网络技术有限公司靠谱吗 湖北人工智能软件开发收费报价表 vs里的连接到数据库怎么用 恩施州服务器机柜质量怎么样 广州通信网络技术 it数据库的维护是干什么的 安徽java软件开发管理 新西兰网络安全策略2019 现在做软件开发最常用的语言 萧县网络安全哪家好 软件开发营销团队组织架构 软件开发及销售税收 hive数据库日期转字符串 如何创建 软件开发公司 河北手机软件开发哪家强 计算机网络技术专业论文致谢
0