springboot-异步、定时、邮件任务

news/2024/9/20 1:29:58/ 标签: java, 开发语言, spring boot, spring, 后端

目录

一,前言

二,异步

2.1,案例:

1,首先创建一个service:

2,Controller:

spring%E6%88%91%E4%BB%AC%E7%9A%84%E5%BC%82%E6%AD%A5%E6%96%B9%E6%B3%95%E6%98%AF%E5%BC%82%E6%AD%A5%E7%9A%84%EF%BC%8C%E6%89%80%E4%BB%A5%E8%A6%81%E5%9C%A8%E6%96%B9%E6%B3%95%E4%B8%8A%E6%B7%BB%E5%8A%A0%E6%B3%A8%E8%A7%A3%C2%A0%40Async-toc" style="margin-left:80px;"> ① 想办法告诉spring我们的异步方法是异步的,所以要在方法上添加注解 @Async

springboot%E4%B8%BB%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%BC%80%E5%90%AF%E5%BC%82%E6%AD%A5%E6%B3%A8%E8%A7%A3%E5%8A%9F%E8%83%BD%40EnableAsync-toc" style="margin-left:80px;">②去springboot主程序中开启异步注解功能@EnableAsync

三,邮件任务

3.1如何实现

        1、引入pom依赖

2、查看自动配置类:MailSenderAutoConfiguration

3 然后我们去看下配置文件

 3、配置文件:

4,首先你需要去邮箱网站开启POP3/SMTP

 5、Spring单元测试 

        5.1简单的邮件

        5.2发送一个较为复杂的邮件:

四,定时任务

4.1如何实现

1,需要的东西

2,cron表达式:

4.2测试步骤:

1、创建一个ScheduledService

2、这里写完定时任务之后,我们需要在主程序上增加@EnableScheduling 开启定时任务功能

3、我们来详细了解下cron表达式;

4.常用表达式


一,前言

在我们的工作中,常常会用到异步处理任务,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。还有一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息。还有就是邮件的发送,微信的前身也是邮件服务呢?这些东西都是怎么实现的呢?其实SpringBoot都给我们提供了对应的支持,我们上手使用十分的简单,只需要开启一些注解支持,配置一些配置文件即可!那我们来看看吧~

二,异步

所谓异步,在某些功能实现时可能要花费一定的时间,但是为了不影响客户端的体验,选择异步执行

2.1,案例:

1,首先创建一个service:

java">@Service
public class AsyncService {public void hello(){try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("数据正在传输...");}
}

2,Controller:

java">@RestController
public class AsyncController {@AutowiredAsyncService asyncService;@RequestMapping("/async")public String async(){asyncService.hello();return "ok";}
}

这样在执行/async请求时,网站会延时三秒再显示ok,后台数据也会三秒后显示数据正在传输

在这里插入图片描述

spring%E6%88%91%E4%BB%AC%E7%9A%84%E5%BC%82%E6%AD%A5%E6%96%B9%E6%B3%95%E6%98%AF%E5%BC%82%E6%AD%A5%E7%9A%84%EF%BC%8C%E6%89%80%E4%BB%A5%E8%A6%81%E5%9C%A8%E6%96%B9%E6%B3%95%E4%B8%8A%E6%B7%BB%E5%8A%A0%E6%B3%A8%E8%A7%A3%C2%A0%40Async"> ① 想办法告诉spring我们的异步方法是异步的,所以要在方法上添加注解 @Async

java">    @Asyncpublic void hello(){try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("数据正在传输...");}

springboot%E4%B8%BB%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%BC%80%E5%90%AF%E5%BC%82%E6%AD%A5%E6%B3%A8%E8%A7%A3%E5%8A%9F%E8%83%BD%40EnableAsync">②去springboot主程序中开启异步注解功能@EnableAsync

java">@EnableAsync
@SpringBootApplication
public class SwaggerDemoApplication {public static void main(String[] args) {SpringApplication.run(SwaggerDemoApplication.class, args);}}

三,邮件任务

邮件发送,在我们的日常开发中,也非常的多,Springboot也帮我们做了支持

邮件发送需要引入spring-boot-start-mail
SpringBoot 自动配置MailSenderAutoConfiguration
定义MailProperties内容,配置在application.yml中
自动装配JavaMailSender
测试邮件发送

3.1如何实现

        1、引入pom依赖

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

     看它引入的依赖,可以看到 jakarta.mail

<dependency><groupId>com.sun.mail</groupId><artifactId>jakarta.mail</artifactId><version>1.6.4</version><scope>compile</scope>
</dependency>

2、查看自动配置类:MailSenderAutoConfiguration

在这里插入图片描述

ok我们点进去,看到里面存在bean,JavaMailSenderImpl
在这里插入图片描述

3 然后我们去看下配置文件

java">@ConfigurationProperties(prefix = "spring.mail"
)
public class MailProperties {private static final Charset DEFAULT_CHARSET;private String host;private Integer port;private String username;private String password;private String protocol = "smtp";private Charset defaultEncoding;private Map<String, String> properties;private String jndiName;
}

 3、配置文件:

spring.mail.username=你的邮箱
spring.mail.password=你的邮箱授权码
spring.mail.host=smtp.163.com
# qq需要配置ssl,其他邮箱不需要
spring.mail.properties.mail.smtp.ssl.enable=true

4,首先你需要去邮箱网站开启POP3/SMTP

在这里插入图片描述

 5、Spring单元测试 

        5.1简单的邮件
java"> @ResourceJavaMailSenderImpl mailSender;@Testvoid contextLoads() {SimpleMailMessage simpleMailMessage = new SimpleMailMessage();simpleMailMessage.setSubject("Hello");simpleMailMessage.setFrom("2983394967@qq.com");simpleMailMessage.setTo("2983394967@qq.com");simpleMailMessage.setText("Hello World");System.out.println("成功");mailSender.send(simpleMailMessage);}
        5.2发送一个较为复杂的邮件:

        

java"> @Testpublic void contextLoads2() throws MessagingException {//邮件设置2:一个复杂的邮件MimeMessage mimeMessage = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);helper.setSubject("通知");helper.setText("<b style='color:red'>今天 7:30来开会</b>",true);//发送附件helper.addAttachment("1.jpg",new File("绝对路径地址"));helper.addAttachment("2.jpg",new File(""));helper.setTo("2983394967@qq.com");helper.setFrom("2983394967@qq.com");mailSender.send(mimeMessage);}

查看邮箱,邮件接收成功!

我们只需要使用Thymeleaf进行前后端结合即可开发自己网站邮件收发功能了!

四,定时任务

项目开发中经常需要执行一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息,Spring为我们提供了异步执行任务调度的方式,提供了两个接口。

4.1如何实现

1,需要的东西

  • TaskExecutor接口
  • TaskScheduler接口

两个注解:

  • @EnableScheduling
  • @Scheduled

 

2,cron表达式:

在这里插入图片描述

 

4.2测试步骤:

1、创建一个ScheduledService

我们里面存在一个hello方法,他需要定时执行,怎么处理呢?

java">@Service
public class ScheduledService {//秒   分   时     日   月   周几//0 * * * * MON-FRI//注意cron表达式的用法;@Scheduled(cron = "0 * * * * 0-7")public void hello(){System.out.println("hello.....");}
}

2、这里写完定时任务之后,我们需要在主程序上增加@EnableScheduling 开启定时任务功能

java">@EnableAsync //开启异步注解功能
@EnableScheduling //开启基于注解的定时任务
@SpringBootApplication
public class SpringbootTaskApplication {public static void main(String[] args) {SpringApplication.run(SpringbootTaskApplication.class, args);}}

3、我们来详细了解下cron表达式;

http://www.bejson.com/othertools/cron/4、常用的表达式

4.常用表达式

java">(1)0/2 * * * * ?   表示每2秒 执行任务
(1)0 0/2 * * * ?   表示每2分钟 执行任务
(1)0 0 2 1 * ?   表示在每月的1日的凌晨2点调整任务
(2)0 15 10 ? * MON-FRI   表示周一到周五每天上午10:15执行作业
(3)0 15 10 ? 6L 2002-2006   表示2002-2006年的每个月的最后一个星期五上午10:15执行作
(4)0 0 10,14,16 * * ?   每天上午10点,下午2点,4点
(5)0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
(6)0 0 12 ? * WED   表示每个星期三中午12点
(7)0 0 12 * * ?   每天中午12点触发
(8)0 15 10 ? * *   每天上午10:15触发
(9)0 15 10 * * ?     每天上午10:15触发
(10)0 15 10 * * ?   每天上午10:15触发
(11)0 15 10 * * ? 2005   2005年的每天上午10:15触发
(12)0 * 14 * * ?     在每天下午2点到下午2:59期间的每1分钟触发
(13)0 0/5 14 * * ?   在每天下午2点到下午2:55期间的每5分钟触发
(14)0 0/5 14,18 * * ?     在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
(15)0 0-5 14 * * ?   在每天下午2点到下午2:05期间的每1分钟触发
(16)0 10,44 14 ? 3 WED   每年三月的星期三的下午2:10和2:44触发
(17)0 15 10 ? * MON-FRI   周一至周五的上午10:15触发
(18)0 15 10 15 * ?   每月15日上午10:15触发
(19)0 15 10 L * ?   每月最后一日的上午10:15触发
(20)0 15 10 ? * 6L   每月的最后一个星期五上午10:15触发
(21)0 15 10 ? * 6L 2002-2005   2002年至2005年的每月的最后一个星期五上午10:15触发
(22)0 15 10 ? * 6#3   每月的第三个星期五上午10:15触发


http://www.ppmy.cn/news/1433504.html

相关文章

深入Spring Boot配置机制:如何高效管理应用配置

一、属性的优先级和配置文件的位置 在Spring Boot应用中&#xff0c;我们可以在多个地方定义配置属性&#xff0c;并且Spring Boot提供了一套优先级排序&#xff0c;来决定同一属性多处定义时的覆盖关系。理解这个机制对于配置管理至关重要。 1. 配置文件查找的顺序 Spring …

【debug记录】有gpu,但是 pytorch仍显示 cpu【原来是新电脑没安装cuda】

原来是新电脑没安装cuda&#xff0c;以为安装了pytorch包就可以了。 检查过程&#xff1a; nvcc 不是内部或外部命令&#xff0c;也不是可运行的程序, 说明没有安装cuda。 查看电脑显卡最高支持cuda版本&#xff1a;nvidia-smi 安装cuda&#xff0c;选择版本&#xff1a;ht…

基于小程序实现的查寝打卡系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

flink1.18.0 流转表 表转流 jdk17 attachAsDataStream

目的 流表互转 而且流sink 表sink同时存在且都可以输出. 依赖类 package flink.luca.flinkTableAndSQL.Convert;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@Data @AllArgsConstructor @NoArgsConstructor public class Outer…

gcc/g++ 的使用

————gcc&#xff1a;只能编译c语言 ————g&#xff1a;c和c都可以编译 当然&#xff0c;c语言编译还是推荐gcc。 在学习gcc/g之前&#xff0c;我们要先了解一些知识点&#xff1a; 一、背景知识 1&#xff0c;预处理 gcc -E就是告诉编译器到预处理阶段就停下来&am…

QBoxLayout的addWidget(QWidget * w)会改变w的parent()

示例&#xff1a; 我希望在page_frame对象中使用orders_add_page对象的price变量&#xff0c; 但按照下面这样写得到的price的值都不对。 int price; orders_add_page::orders_add_page(QWidget *parent): QDialog(parent) {ui.setupUi(this);page new page_frame(type, t…

Windows10如何关闭Edge浏览器的Copilot

在Windows10更新后&#xff0c;打开Edge浏览器&#xff0c;无论复制什么内容&#xff0c;都会弹出Copilot人工智能插件&#xff0c;非常令人反感&#xff0c;网上搜索的关闭方法都非常麻烦&#xff0c;比如&#xff1a;组策略和注册表。自己摸索得出最简便有效的关闭方法。 1、…

go语言实现简单登陆样例

目录 1、代码实现样例&#xff1a; 2、postman调用&#xff0c;获取登陆后的token&#xff1a; 1、代码实现样例&#xff1a; package mainimport ("net/http""time""github.com/dgrijalva/jwt-go""github.com/gin-gonic/gin" )var …

【算法】约瑟夫环

文章目录 题目一1.数组模拟1.1出圈顺序递归求出圈顺序 1.2最后出圈人 2.环形链表【DEMO】3.递推求最后出圈人3.13.2 题目二1.数组模拟2.递推求最后出圈人2.12.2 题目一 1-n编号 s开始1-m报数 报到m出圈 求出圈顺序or最后人 1.数组模拟 1.1出圈顺序 递归求出圈顺序 // AC输入…

开源模型应用落地-LangChain高阶-集成vllm-QWen1.5(一)

一、前言 通过langchain框架调用本地模型,使得用户可以直接提出问题或发送指令,而无需担心具体的步骤或流程。vLLM是一个快速且易于使用的LLM推理和服务库。通过两者的结合,可以更好地处理对话,提供更智能、更准确的响应,从而提高对话系统的性能和用户体验。 二、术语 2.…

大语言模型微调过程中的 RLHF 和 RLAIF 有什么区别?

目前想要深入挖掘大型语言模型&#xff08;LLM&#xff09;的全部潜力需要模型与我们人类的目标和偏好保持一致。从而出现了两种方法&#xff1a;来自人类反馈的人力强化学习&#xff08;RLHF&#xff09;和来自人工智能反馈的人工智能驱动的强化学习&#xff08;RLAIF&#xf…

服务器基础知识(2)

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;服务器❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 一、如何选择服务器主机 选择服务器主机时&#xff0c;需要考虑以下几个关键因素&#xff1a; 用途和需…

MYSQL 8.0的Linux - Generic版本安装

1.本文适用范围 适用于MYSQL 8.0的Linux - Generic版本&#xff0c;原则上适用所有的操作系统。已测试的操作系统包括&#xff1a; Ubuntu 16.04Ubuntu 18.04Ubuntu 20.04Ubuntu 22.04Kylin Linux Advanced Server V10 ​ 注意&#xff1a;如果操作系统使用过包管理系统&…

JAVA toString方法详解

hi&#xff0c;我是程序员王也&#xff0c;一个资深Java开发工程师&#xff0c;平时十分热衷于技术副业变现和各种搞钱项目的程序员~&#xff0c;如果你也是&#xff0c;可以一起交流交流。 今天我们来聊聊Java中toString方法~ toString方法的定义 在Java中&#xff0c;toStri…

医院信创FTP要进行替代,有什么值得信赖的方案?

信创产业&#xff0c;即信息技术应用创新产业。其发展核心在于通过行业 应用拉动构建国产化信息技术软硬件底层架构体系和全生命周期生态体系&#xff0c;解决核心技术关键环节“卡脖子”的问题&#xff0c;为中国未来发展奠定坚实的数字基础。 2018 年 以来&#xff0c;受“华…

蓝桥杯2024年第十五届省赛真题-拔河

审题可能会遇到的问题&#xff1a;认为所有人都必须参与拔河&#xff0c;但其实不用&#xff0c;只要符合l1<r1<l2<r2就行&#xff0c;不一定要全部人上场&#xff0c;比如只上场a1和a2他们的力量差是1其实也可以。 正解思路&#xff1a;前缀和枚举二分。枚举左区间&…

MT8788智能模块简介_MTK联发科安卓核心板方案厂商

MT8788安卓核心板是一款具备超高性能和低功耗的4G全网通安卓智能模块。该模块采用联发科AIOT芯片平台&#xff0c;供货周期长。 MT8788核心板搭载了12nm制程的四个Cortex-A73处理器核心和四个Cortex-A53处理器核心&#xff0c;最高主频可达2.0GHz。板载内存容量可选为4GB64GB(也…

如何恢复已删除的微信联系人?

“您好&#xff0c;我删除了微信中的 5 个联系人。微信中已删除的联系人可以恢复吗&#xff1f;我使用的是 iPhone 15。” – 董奇 现在&#xff0c;越来越多的人使用微信应用程序与他人交流。微信中的联系人可能对我们来说非常重要。如果您误删了一些联系人&#xff0c;则必须…

Rust入门-引用借用

一、引用借用&#xff0c;是什么、为什么、怎么用 所有权上篇我们已经讨论过了&#xff0c;所以这篇我们讨论Rust的引用借用 1、引用借用 是什么&#xff1f; Rust 通过借用(Borrowing) 这个概念来达成上述的目的&#xff0c;获取变量的引用&#xff0c;称之为借用(borrowin…

Java | Leetcode Java题解之第48题旋转图像

题目&#xff1a; 题解&#xff1a; class Solution {public void rotate(int[][] matrix) {int n matrix.length;// 水平翻转for (int i 0; i < n / 2; i) {for (int j 0; j < n; j) {int temp matrix[i][j];matrix[i][j] matrix[n - i - 1][j];matrix[n - i - 1]…