SpringBoot任务篇Ⅴ --- 异步任务、定时任务、邮件任务

Java的任务在项目中需要用到的地方很多,比如,每月月末的财务报表给财务部门,定时给领导发个邮件短信等等。这时候我们就需要用到任务了,任务调度本身涉及到多线程并发、运行时间规则制定和解析、场景保持与恢复、线程池维护等诸多方面的工作。之前的学习中也使用过任务的框架Quartz,用起来也十分地编辑。本篇文章主要讲的是SpringBoot中基于注解的任务调度的简单使用。

 一.异步任务

正常情况下,同一线程中的方法是同步执行的,比如我要请求一段数据,但是这个数据等待service层执行3s之后,然后才能返回给我,而且这个service层与我想到得到的数据没有丝毫关系。如果想要不等待service层处理数据的话,只能开启一个线程去执行service层方法,然后另外一个线程直接返回数据给我。但是这样做的话会变得很麻烦,所以我们可以使用异步任务的方式,就可以实现我上面的需求。

1.1 开启异步任务注解

@SpringBootApplication
@EnableAsync //开启异步注解
public class Springboot04TaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(Springboot04TaskApplication.class, args);
    }

}

1.2 异步任务执行方法

@Service
public class AsyncService {
    @Async
    public void hello(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("处理数据中");
    }
}

1.3 异步任务测试

@Controller
public class AsyncController {
    @Autowired
    AsyncService asyncService;

    @GetMapping("/hello")
    @ResponseBody
    public String hello(){
        asyncService.hello();
        return "success";
    }
}

运行项目,访问“/hello”请求,若页面没有经过等待直接返回“success”数据,经过3s之后控制台打印了“处理数据中”说明该异步任务执行成功。

 

二.定时任务

定时任务的使用方式和异步任务的差不多。不过需要注意的是定时任务的core表达式。

2.1 core表达式

例如:

@Scheduled(cron = "0 * * * * MON-SAT")  每分钟的整秒的时候执行该方法

@Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")  每分钟0,1,3,4秒的的时候执行该方法

@Scheduled(cron = "0-4 * * * * MON-SAT")  每分钟0,1,3,4秒的的时候执行该方法

@Scheduled(cron = "0/4 * * * * MON-SAT") 每四秒执行一次 (/设定步长)

@Scheduled(cron = "0 0 2-4 ? * 1#1") 每个月的第一个周一凌晨2点到4点期间, 每个整点都执行一次

2.2 定时任务使用

@EnableScheduling //开启定时任务注解
@SpringBootApplication
public class Springboot04TaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(Springboot04TaskApplication.class, args);
    }

}
@Service
public class ScheduledService {
    /**
     * second,minute,hour,day of month,month,day of week
     * 0 * * * * MON-FRI
     */
    @Scheduled(cron = "0/4 * * * * MON-SAT")  //每四秒执行一次 (/设定步长)
    public void say(){
        System.out.println("Hello...");
    }
}

 

三.邮件任务

SpringBoot还整合了邮件任务功能,这使得邮箱服务器发送邮件变得十分容易。

3.1 准备工作

3.1.1 导入邮件任务依赖

 <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-mail</artifactId>
         <scope>test</scope>
 </dependency>

3.1.2 邮箱配置

准备两个邮箱,一个用来发送邮件,另一个用来接收邮件。其中发件的邮箱需要配置开启一下SMTP服务器服务,开启的后会得到发件邮箱密钥,记得保存起来,这将会在后面用到。

3.2 配置参数

spring.mail.username=**********@qq.com
#填入上面开启服务获得的密钥
spring.mail.password=*************
spring.mail.host=smtp.qq.com
#配置安全链接
spring.mail.properties.mail.smtp.ssl.enable=true

3.3 发送简单邮件

@Autowired
JavaMailSenderImpl mailSender;
@Test
    public void contextLoads() {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setSubject("通知");//设置标题
        simpleMailMessage.setText("恭喜你获得了优秀员工奖");//内容
        simpleMailMessage.setTo("*********@163.com"); //收件人邮箱账户
        simpleMailMessage.setFrom("********@qq.com"); //寄件人邮箱账户
        mailSender.send(simpleMailMessage);
    }

3.4 发送复杂邮件

@Autowired
JavaMailSenderImpl mailSender;
@Test
    public void compMail(){
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        try {
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            mimeMessageHelper.setSubject("重要通知");//设置标题
            mimeMessageHelper.setText("恭喜你获得了优秀员工奖");//内容
            mimeMessageHelper.setText("<b style='color:red'>年终奖翻倍</b>",true);//内容  第二个参数设置是否识别html,true表示识别为html内容
            mimeMessageHelper.addAttachment("1.jpg",new File("C:\\Users\\admin\\Desktop\\快递\\快递面单\\圆通.png")); //传输文件
            mimeMessageHelper.addAttachment("2.jpg",new File("C:\\Users\\admin\\Desktop\\workdown\\pic\\jvm运行时数据区域.jpg"));
            mimeMessageHelper.setTo("************@163.com"); //收件人邮箱
            mimeMessageHelper.setFrom("*********@qq.com"); //寄件人邮箱
            mailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }

    }

 

转载于:https://www.cnblogs.com/wangxiayun/p/10298235.html

避坑指南:CesiumLab+ENVI处理Sentinel-2影像数据的完整流程 本文提供了一份详细的避坑指南,完整介绍了如何利用CesiumLab和ENVI工具链,将Sentinel-2卫星影像处理成可供Cesium三维地球引擎加载的离线瓦片数据。内容涵盖数据获取、SNAP预处理、ENVI影像增强合成以及CesiumLab切片配置等全流程实战步骤与关键参数优化,旨在帮助工程师高效构建自主可控的高精度离线地图服务。 阅读详情

相关推荐

局部路径规划算法 - B样条曲线(B-spline Curves)

本文详解了B样条以及代码实现

BigDavid123的博客 6451

Core表达式详解【spring-boot定时任务使用内容】

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:  Seconds Minutes Hours DayofMonth Month DayofWeek Year或  Seconds Minutes Hours DayofMonth Month DayofWeek 每一个域可出现的字符如下:  Seconds:可出现", - ...

qq_36826506的博客 3818

大模型呼叫中心场景分享之六:大模型外呼IT运维告警——智能监控与自动化响应的未来

在数字化运维(IT Operations)中,实时监控系统健康状态并及时响应告警是保障业务连续性的关键。传统的IT告警方式(如邮件、短信、钉钉/企业微信通知)存在信息过载、响应延迟、人工处理效率低等问题。而大模型(LLM)与语音技术(TTS/ASR)的结合,为IT运维告警提供了更智能的解决方案——大模型外呼告警系统。大模型外呼告警系统正在重新定义IT运维的效率和体验。通过实时语音交互+智能自动化,企业能够将平均故障修复时间(MTTR)从小时级缩短至分钟级。

开源呼叫中心系统FreeIPCC的博客 908

springboot调度任务

注:调度任务类上有注解@Component,调度方法上带注解@Scheduled,启动引导类上有注解@EnableScheduling,调度任务是单线程执行 一、@Scheduled参数说明 @Scheduled(cron = "0/3 * * * * ?") 从0秒开始,每隔3秒执行一次 @Scheduled(initialDelay = 1000, fixedRate = 2000) 第...

zsx18273117003的博客 1188

十分钟!!java项目快速集成core表达式并配置到Nacos

java项目快速集成core表达式

a59457asdf的博客 588

SpringBoot-集成-Thymeleaf-常用表达式

1选择变量表达方法 语法:*{…} 选择变量表达式,也叫星号变量表达式,使用th:object属性来绑定对象,比如: 后台 @Controller public class UserController { @RequestMapping("/list") public String test(Model model){ User user=new User(...

T 3030

springboot学习--定时任务及cron表达式

在做项目时有时候会有定时器任务的功能,比如某某时间应该做什么,多少秒应该怎么样之类的。 spring支持多种定时任务的实现。我们来介绍下使用spring的定时器   1.我们使用spring-boot作为基础框架,其理念为零配置文件,所有的配置都是基于注解和暴露bean的方式。   2.使用spring的定时器:     spring自带支持定时器的任务实现。其可通过简单配置来使用到简单的...

Destiny宿命的博客 1万+

消息队列—RabbitMQ(万字详解)

在基于微服务开发的电商项目中,商品的查询和商品的修改是通过两个服务实现的,如果修改了商品的价格,如何保证商品查询服务查询出来的商品价格同步更新呢?同步调用➢ A服务调用B服务,需要等待B服务执行完毕的返回值,A服务才可以继续往下执行。和RPC(Dubbo)实现同步调用。异步调用➢ A服务调用B服务,而无需等待B服务的执行结果,也就是说在B服务执行的同时A服务可以继续往下执行。➢ 通过:消息队列实现异步调用。 MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通

How many ten years in the life time? 6334

SpringBoot 定时任务 || cron表达式

SpringBoot 定时任务 || cron表达式 定时任务实现的几种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。 ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。 Spring Task:Spr

weixin_44210688的博客 560

springboot定时任务

定时任务 SpringBoot自带了定时任务的实现,使用@Scheduled注解即可实现,并在启动类上添加@EnableScheduling即可。 定时任务线程默认使用同一条线程,如果单个任务耗时超过fixedRate就没有意义了。 如果需要实现异步定时任务可以再加上@Async注解,或通过spring.task.scheduling.pool.size配置定时任务线程池大小。 @Scheduled注解的参数和定时任务线程池的参数相似,有四种: fixedRate:固定速率执行,例如每3秒执行一次 fixe

有饭我不吃,哎,就是学! 1202

SpringBoot Quartz 总结(动态任务,Corn表达式)

我就直接粘贴代码了,后台包括了jar包的引入,任务管理类(可以动态的创建任务,删除任务,暂停任务等等),解决Quartz不能引入bean的问题,SpringBoot初始化启动Quartz等等. 关于创建Job类是写一个类实现Job接口并且实现Job中的execute方法.这个可以网上去搜我就不粘贴了. 前台涉及到了填写Corn表达式,由于Corn表达式即使相对于后台人员来说也是相当复杂的,更别说...

ZhuPengWei_ 2312

Springboot定时任务的实现

1、定时任务在J2EE项目中经常会被用到,如自动取消订单、在指定的时间清空缓存等需求就需要定时任务来实现。定时任务的完成是靠轮询来实现的,所以存在一定的延时误差是合理的。springboot在实现定时任务的过程中相关的依赖已经在父依赖中被导入了,所以不需要导入额外的依赖。 2、SpringBoot定时任务的实现分两步:(1、)定时任务的的实现; (2、)创建调度表达式;

Purse的博客 4726

springboot+Ajax实时读取数据库

最近有个项目需要实现采集信息在web端的实时显示,由于采集器与web端之间唯一的交互途径就是通过数据库,而采集器端会定时上传采集到的信息到数据库,所以想到一种方法就是让web端也定时的读取数据库,并且通过数据库操作(将采集时间进行逆序排序并取最新的一个)获得最新采集到的数据,并通过ajax在不刷新整个网页的基础上将数据显示到网页的table中 本博客是将本人学习的过程已经最终实现的结果予以...

hh_h_hhh_d的博客 4237

Spring Boot 集成Spring Schedule定时任务执行功能(动态修改执行时间)

Spring Boot 集成Spring Schedule 启动类添加@EnableScheduling注解 支持动态执行时间 实现接口SchedulingConfigurer的方法configureTasks方法 调用参数ScheduledTaskRegistrar类的addTriggerTask方法,新建线程执行业务逻辑,新建Trigger获取执行时间 参考:https://blog.csdn...

123 木头人 4387

.net core任务调度_探索.NET Core库Coravel以进行任务调度,缓存,邮件发送等

Coravel claims it is a "Near-zero config .NET Core library that makes Task Scheduling, Caching, Queuing, Mailing, Event Broadcasting (and more) a breeze!" A lovely claim, that is, in fact, true! It's ...

2207

spring boot定制定时任务(项目自启动)/每周报表生成/邮件发送

遇到了一个每周生成报表并发送至特定邮箱的需求,这个需求比较麻烦因为有三个难点: 1.如何将获取的数据生成excel文件,在这个项目中我使用的是POI,利用poi生成表格存储在特定的位置。 2.如何将表格作为附件发到指定邮箱,这里用的是javax.mail的包,需要注意的是要用附件就要用MimeBodyPart装载入message。 3.如何定时生成报表并发送呢?找了几种方法,有用Quartz...

weixin_41263382的博客 1790

解决 Activiti UEL 表达式解析异常 TreeBuilderException

在Activiti工作流中,排他/包容网关条件表达式因嵌套${}导致UEL解析失败,抛出TreeBuilderException。根源在于UEL语法禁止表达式内再次使用${},且需避免XML特殊字符干扰。解决方案包括:移除内部定界符、使用CDATA包裹表达式、确保返回布尔值。建议通过正则扫描、IDE插件校验、编码规范(如单引号字符串、复杂逻辑外置)及测试验证,从源头预防此类问题。

小李同学的博客 562

【LLM】第六章:LangChain框架中的大模型的创建与调用

说明:本章的环境安装在第一章已经进行了详细的说明了。需要环境搭建好,才好运行本的代码。

因为热爱所以坚持 177

Java EE 进阶:3.SpringBoot 快速上手(第一弹):配置环境

Java EE 进阶:3.SpringBoot 快速上手(第一弹):配置环境

要努力去发光,而不是被照亮~ 478

基于Spring AI 的智能聊天机器人

该项目使用最新的Spring AI 2.0.x ,从零开始搭建智能体;文章提到有些代码可使用多种方式书写,这些不同的书写方式都是从Spring AI官方得来,自己也实践了。

Qq121363Aa的博客 174

jquick-pdf 核心原理解析:基于 HTML 模板动态渲染 PDF 的实现逻辑

六层链路是排错地图:读入、解析、变量绑定、布局与分页、渲染输出、结果返回,异常先分层再定位。二分删减是最实用的定位手段:先保留标题与一段文字,再逐项恢复表格、绑定值与分页节点。显式分页与自然分页必须分开回归;只是分页提示,不是绝对约束。适用边界与常见误区:jquick-pdf 位于“模板抽象”与“纯 Java 部署”之间,适合规则明确的业务文档,不适合依赖脚本与完整浏览器布局的页面;它与 iText、PdfBox 不是替代关系,后两者在底层控制上更强。

PaoHaiJiao的博客 640

Drools vs JVS-Rules 实战对比:如何用技术手段实现业务可配置的规则引擎

本文从工程落地视角出发,对比 Drools 与 JVS-Rules 在热更新、变量加工、决策编排三方面的技术实现机制,重点解析 JVS-Rules 如何通过微服务动态加载、函数式变量封装、可视化节点引擎等设计,支撑业务人员低代码参与规则全生命周期。

439
上一篇: SpringBoot检索篇Ⅳ --- 整合ElasticSearch
下一篇: SpringBoot安全篇Ⅵ --- 整合Spring Security
dd10850
博客等级 码龄11年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值