Spring Boot学习之任务学习【异步、定时、邮件】

news2024/11/16 7:25:25

文章目录

  • 一 异步任务
    • 1.1 创建spring Boot项目,选择Spring Web
    • 1.2 创建AsyncService类
    • 1.3 编写controller类
    • 1.4 在启动类上开启异步功能
    • 1.5 测试结果
  • 二 定时任务
    • 2.1 基础知识
    • 2.2 项目创建
    • 2.3 创建一个ScheduledService
    • 2.4 在主程序上增加@EnableScheduling 开启定时任务功能
    • 2.5 测试结果
  • 三 邮件任务
    • 3.1 项目创建
    • 3.2 源码探究
    • 3.3 编辑springboot配置文件
    • 3.4 测试

一 异步任务

  • 异步处理是非常常用的
    • 比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。

1.1 创建spring Boot项目,选择Spring Web

在这里插入图片描述

  • spring3.0.2不支持jdk1.8,记得选择2.7.8或者更低的版本
    在这里插入图片描述
  • 同时注意项目结构和pom中java版本是否正确
    在这里插入图片描述

1.2 创建AsyncService类

  • 编写方法,假装正在处理数据,使用线程设置一些延时,模拟同步等待的情况
    在这里插入图片描述
  • 使用@Async注解,SpringBoot就会自己开一个线程池,进行调用。
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Service;
    
    /**
     * @author 缘友一世
     * date 2023/1/28-20:07
     */
    @Service
    public class AsyncService {
        @Async //告诉Spring这是一个异步方法
        public void hello() {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("数据处理中···");
        }
    }
    

1.3 编写controller类

import com.yang.service.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 缘友一世
 * date 2023/1/28-20:09
 */
@RestController
public class AsyncController {
    @Autowired
    AsyncService asyncService;

    @RequestMapping("/hello")
    public String hello() {
        asyncService.hello();
        return "ok";
    }
}

1.4 在启动类上开启异步功能

  • 加注解@EnableAsync ,开启异步注解功能;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.scheduling.annotation.EnableAsync;
    
    @SpringBootApplication
    @EnableAsync //开启异步注解功能
    public class SpringTaskApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringTaskApplication.class, args);
        }
    
    }
    
    

1.5 测试结果

在这里插入图片描述

二 定时任务

2.1 基础知识

  • 项目开发中经常需要执行一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息,Spring为我们提供了异步执行任务调度的方式,提供了两个接口
    • TaskScheduler 任务调度者
    • TaskExecutor 任务执行者
  • 两个注解
    • @EnableScheduling 开启定时功能的注解
    • @Scheduled 表示执行的时机

  • cron
    • 计划任务,是任务在约定的时间执行已经计划好的工作。
    • 在Linux中,我们经常用到 cron 服务器来完成这项工作。
    • cron服务器可以根据配置文件约定的时间来执行特定的任务。
    • cron百度百科
    • cron在线生成器
字段允许值允许的特殊字符
0~59,- * /
0~59,- * /
0~23,- * /
日期1~31,- * ? /L W C
1~12,- * /
星期0~7或SUN-SAT,- * ? / L C #
字符含义
枚举
-区间
*任意
/步长
日/星期冲突匹配
L最后
W工作日
C和calendar联系后计算过的值
#星期,4#2——第二个星期三

2.2 项目创建

  • 同异步任务创建项目步骤

2.3 创建一个ScheduledService

```java
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

/**
 * @author 缘友一世
 * date 2023/1/29-9:41
 */
@Service

public class ScheduledService {
    //秒 分 时 日 月 周几
    //0 * * * * MON-FRI
    //cron表达式
    @Scheduled(cron="0 50 9 * * ?")
    public void hello() {
        System.out.println("hello");
    }
}

```

2.4 在主程序上增加@EnableScheduling 开启定时任务功能

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling //开启定时功能
public class SpringTimedTaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringTimedTaskApplication.class, args);
    }
}

2.5 测试结果

在这里插入图片描述

三 邮件任务

3.1 项目创建

  • 同异步任务项目创建,请参看前面的内容
  1. 邮件发送需要引入spring-boot-start-mail
    <!--javax.mail-->
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-mail</artifactId>
     </dependency>
    

3.2 源码探究

  1. ctrl+鼠标左键,点击<artifactId>spring-boot-starter-mail</artifactId>进入到其pom文件,可以发现其依赖中存在

    <dependency>
          <groupId>com.sun.mail</groupId>
          <artifactId>jakarta.mail</artifactId>
          <version>1.6.7</version>
          <scope>compile</scope>
        </dependency>
    
  2. 查看自动配置类:MailSenderAutoConfiguration

    • 方法一:双击shift在搜索框中输入MailSenderAutoConfiguration,进行搜索
    • 方法二:在外部库中手动查找
      在这里插入图片描述
      在这里插入图片描述
    • 进入MailSenderAutoConfiguration中,发现这个类中并没有注册@Bean 在这里插入图片描述
    • 最终查看导入的类中MailSenderJndiConfiguration.class发现了@Bean
    private final MailProperties properties;
    MailSenderJndiConfiguration(MailProperties properties) {
        this.properties = properties;
    }
    @Bean
        JavaMailSenderImpl mailSender(Session session) {
            JavaMailSenderImpl sender = new JavaMailSenderImpl();
            sender.setDefaultEncoding(this.properties.getDefaultEncoding().name());
            sender.setSession(session);
            return sender;
        }
    
    • 然后点进MailProperties查看配置文件
    @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.3 编辑springboot配置文件

  1. 获取授权码【这里以QQ邮箱为例】
    • 登录QQ邮箱
      在这里插入图片描述
    • 下滑找到如下内容,点击开启POP/SMTP服务
      在这里插入图片描述
    • 按照要求进行操作
      在这里插入图片描述
    • 获取到授权码,将其复制
      在这里插入图片描述
  2. 配置springboot文件
    spring.mail.username=2330648064@qq.com
    spring.mail.password= xxxxxxxxx#(授权码)
    spring.mail.host=smtp.qq.com
    #开启加密验证
    spring.mail.properties.mail.smtp.enable=true
    

3.4 测试

  1. 编写测试代码
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.mail.SimpleMailMessage;
    import org.springframework.mail.javamail.JavaMailSenderImpl;
    import org.springframework.mail.javamail.MimeMessageHelper;
    
    import javax.mail.MessagingException;
    import javax.mail.internet.MimeMessage;
    import java.io.File;
    
    @SpringBootTest
    class SpringTaskApplicationTests {
        @Autowired
        JavaMailSenderImpl mailSender;
        //简单邮件
        @Test
        void contextLoads() {
            SimpleMailMessage mailMessage = new SimpleMailMessage();
            mailMessage.setSubject("hello");//标题
            mailMessage.setText("thank you");
    
            mailMessage.setTo("2330648064@qq.com");
            mailMessage.setFrom("2330648064@qq.com");
    
            mailSender.send(mailMessage);
        }
        //复杂邮件
        @Test
        void contextLoads2() throws MessagingException {
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            //组装
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            //正文
            helper.setSubject("hello2");
            helper.setText("<h1 style='color:red'>thank you2</h1>",true);
            //附件
            //使用内容根路径成功!
            helper.addAttachment("01.jpg",new File("src/main/resources/static/test01.jpg"));
    
            helper.setTo("2330648064@qq.com");
            helper.setFrom("2330648064@qq.com");
    
            mailSender.send(mimeMessage);
        }
    }
    
  2. 测试结果
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hbuilder打包成苹果IOS-App的详解

本文相关主要记录一下使用Hbuilder打包成苹果IOS-App的详细步骤。介绍一下个人开发者账号&#xff1a;再说下什么是免费的苹果开发者账号&#xff0c;就是你没交688年费的就是免费账号&#xff0c;如果你想变成付费开发者账号&#xff0c;提交申请付费就行&#xff0c;账号都是…

【C++】priority_queue使用模拟实现

priority_queue使用 http://www.cplusplus.com/reference/queue/priority_queue/ 文档介绍 优先级队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的(大堆为例) 在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)…

应用系统基于OAuth2实现单点登录的解决方案

1、OAuth2单点认证原理 基于OAuth2的认证方式包含四种&#xff0c;其中单点登录最常用的是授权码模式&#xff0c;其基本的认证过程如下&#xff1a; 用户访问业务应用&#xff0c;业务应用进行登录检查&#xff1b;业务应用重定向到OAuth2认证服务器&#xff0c;调用获取授权…

米哈伊年终奖是32万,我的年终奖是彩虹屁!

数据来源沉默王二 | 数据报表小熊绘制 年都过完了&#xff0c;年终奖结果也都出来了&#xff0c;我这个年没有过好&#xff0c;每次想到就难受&#xff0c;在看王二整理出来的年终奖&#xff0c;整个人都不好了。 本次统计基于49条数据的不准确统计&#xff0c;仅抽取部分公司部…

Lesson 4.4 随机梯度下降与小批量梯度下降

文章目录一、损失函数理论基础二、随机梯度下降&#xff08;Stochastic Gradient Descent&#xff09;1. 随机梯度下降计算流程2. 随机梯度下降的算法特性3. 随机梯度下降求解线性回归4. 随机梯度下降算法评价三、小批量梯度下降&#xff08;Mini-batch Gradient Descent&#…

SpringMVC执行流程和原理

1、用户发送出请求到前端控制器DispatcherServlet。 2、DispatcherServlet收到请求调用HandlerMapping&#xff08;处理器映射器&#xff09;。 3、HandlerMapping找到具体的处理器(可查找xml配置或注解配置)&#xff0c;生成处理器对象及处理器拦截器 (如果有)&#xff0c;再…

51单片机学习笔记-3模块化编程

3 模块化编程 [toc] 注&#xff1a;笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 3.1 模块化编程 传统方式编程&#xff1a;所有的函数均放在main.c里&#xff0c;若使用的模块比较多&#xff0c;则一个文件内会有很多的…

1604_linux环境下使用命令行把网页转换成pdf

全部学习汇总&#xff1a; GreyZhang/toolbox: 常用的工具使用查询&#xff0c;非教程&#xff0c;仅作为自我参考&#xff01; (github.com) 使用的工具很容易在彼此之间产生隔离性障碍&#xff0c;比如我最近使用的墨水屏阅读的最合适的文件格式我觉得是pdf&#xff0c;但是我…

路由工具之路由策略router-policy、acl列表与ip-prefix前缀列表的区别、过滤列表filter-policy

3.0.0 路由工具之路由策略router-policy、acl列表与ip-prefix前缀列表的区别、过滤列表filter-policy 目录IP-Prefix前缀列表前缀列表与ACLrouter-policy路由策略应用路由策略过滤路由1、环境介绍2、配置OSPF3、过滤路由&#xff08;1&#xff09;ACL匹配路由方式过滤&#xff…

带死区的PID控制算法及仿真

在计算机控制系统中&#xff0c;某些系统为了避免控制作用过于频繁&#xff0c;消除由于频繁动作所引起的振荡&#xff0c;可采用带死区的PID控制算法&#xff0c;控制算式为&#xff1a;式中&#xff0c;e(k)为位置跟踪偏差;e为一个可调参数&#xff0c;其具体数值可根据实际控…

软件测试职场六年,一个女测试工程师的自我认知

微软自动化测试二年&#xff0c;而后转入阿里做自动化测试三年&#xff0c;经历了入行时的迷茫&#xff0c;而后的笃定&#xff0c;转入移动后对自身定位和价值的怀疑&#xff0c;继而对自动化测试的重新认识&#xff0c;职场六年&#xff0c;终于敢对自动化测试有所论述了。 先…

五个好用的PDF软件推荐!

我们在工作中经常需要选择一款好用的办公软件来转换PDF文件&#xff0c;如果选择的软件不好用&#xff0c;那就回影响我们工作的效率&#xff0c;如果选对了软件&#xff0c;就可以让我们的效率越来越高&#xff0c;足以证明软件的在我们办公中的重要性&#xff0c;下面小编就来…

win远程桌面连接无显示器Ubuntu(22.04.1 LTS)

1、安装ssh server 安装虚拟显示器会导致物理显示器无法使用&#xff0c;为防止虚拟显示出现问题无法连接Ubuntu&#xff0c;在必要时可以使用SSH连接系统。 # Ubuntu Terminal sudo apt-get install openssh-server在Windows中尝试连接 # Windows PowerShell ssh UsernameU…

C语言递归函数(递归调用)详解

一个函数在它的函数体内调用它自身称为递归调用&#xff0c;这种函数称为递归函数。执行递归函数将反复调用其自身&#xff0c;每调用一次就进入新的一层&#xff0c;当最内层的函数执行完毕后&#xff0c;再一层一层地由里到外退出。递归函数不是C语言的专利&#xff0c;Java、…

css背景

1、背景颜色&#xff1a;半透明 <style>div{width: 1000px;height: 100px;/* 背景颜色半透明&#xff0c;其他文字不受影响 */background: rgba(0 ,0 ,0 ,0.3 );}</style> </head> <body><div></div> </body>2、背景图 属性名: ba…

vue前端框架课程笔记(一)

目录初识Vue演示代码模板语法插值语法指令语法使用举例数据绑定两种数据绑定方式示例el和data的两种写法el的两种写法data的两种写法MVVM模型数据代理Object.defineProperty示例参数说明关于getter和setter使用举例泛化的数据代理举例vue中的数据代理原理事件处理指令methods配…

word样式管理:如何对样式进行修改删除

在前面的图文中简单为大家介绍了Word文本样式和表格样式的创建技巧。但对于已经创建好的样式&#xff0c;有时会对样式中的格式进行再次修改&#xff1b;或者是当拿到某个Word文档&#xff0c;它的样式经历多次或多人不断修改&#xff0c;可能导致样式库中的样式混乱不堪&#…

Dockerfile构建Tomcat镜像

Dockerfile构建Tomcat镜像构建步骤1 编写Dockfile文件2 dockcer build构建镜像3 docker run运行容器4 使用容器卷挂载搜索镜像的个数 docker search tomcat |wc -l因此&#xff0c;需要根据自己的项目需求来针对性的构建镜像 构建步骤 1 编写Dockfile文件 看成在编写一个纯净…

React 项目 黑马极客园

React 项目 黑马极客园git地址视频地址项目准备1.项目介绍2.项目搭建3.使用scss预处理器4.配置基础路由5.组件库antd使用6.配置别名路径8.别名路径提示9.安装dev-tools调试工具登录模块1.基本结构搭建2. 创建表单结构3. 表单校验实现4. 获取登录表单数据5. 封装http工具模块6. …

Android Studio Electric Eel | 2022.1.1 版本

前言 各位读者&#xff0c;新年快乐&#xff0c;现在是2023年了&#xff0c;新的一年&#xff0c;我们的开发也会焕然一新&#xff0c;Android开发的工具Android Studio&#xff0c;也能更新到Android Studio Electric Eel | 2022.1.1 版本了&#xff0c;短期内我将使用此版本学…