SpringBoot 异步、邮件任务

news2024/11/24 0:14:31

异步任务

  1. 创建一个Hello项目

  2. 创建一个类AsyncService

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

    编写方法,假装正在处理数据,使用线程设置一些延时,模拟同步等待的情况;

    @Service
    public class AsyncService {
    
       public void hello(){
           try {
               Thread.sleep(3000);
          } catch (InterruptedException e) {
               e.printStackTrace();
          }
           System.out.println("业务进行中....");
      }
    }
    
  3. 编写AsyncController类

    我们去写一个Controller测试一下

    @RestController
    public class AsyncController {
    
       @Autowired
       private AsyncService asyncService;
    
       @GetMapping("/hello")
       public String hello(){
           asyncService.hello();
           return "OK";
      }
    
    }
    
  4. 访问http://localhost:8080/hello进行测试,3秒后出现OK,这是同步等待的情况。
    在这里插入图片描述

    问题:我们如果想让用户直接得到消息,就在后台使用多线程的方式进行处理即可,但是每次都需要自己手动去编写多线程的实现的话,太麻烦了,我们只需要用一个简单的办法,在我们的方法上加一个简单的注解即可,如下:

  5. 给hello方法添加@Async注解;

    //告诉Spring这是一个异步方法
    @Async
    public void hello(){
       try {
           Thread.sleep(3000);
      } catch (InterruptedException e) {
           e.printStackTrace();
      }
       System.out.println("业务进行中....");
    }
    

    SpringBoot就会自己开一个线程池,进行调用!但是要让这个注解生效,我们还需要在主程序上添加一个注解@EnableAsync ,开启异步注解功能;

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

7、重启测试,网页瞬间响应,后台代码依旧执行!

邮件任务

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

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

测试:

  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>
       <scope>compile</scope>
    </dependency>
    
  2. 查看自动配置类:MailSenderAutoConfiguration

    image-20200801104504309

    这个类中存在bean,JavaMailSenderImpl

    在这里插入图片描述

    然后我们去看下配置文件

    @ConfigurationProperties(prefix = "spring.mail")
    public class MailProperties {
    
    	private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
    	private String host;
    	private Integer port;
    	private String username;
    	private String password;
    	private String protocol = "smtp";
    	private Charset defaultEncoding = DEFAULT_CHARSET;
    	private Map<String, String> properties = new HashMap<>();
    	private String jndiName;
    	//set、get方法省略。。。
    }
    
    
  3. 配置文件:

     spring:
       mail:
         username: 2356731504@qq.com
         password: 你的qq授权码
         host: smtp.qq.com
         properties:
           mail:
             smtp:
               ssl:
                 enable: true # qq需要配置ssl
    

    获取授权码:在QQ邮箱中的设置->账户->开启pop3和smtp服务

    image-20200801105503766

  4. Spring单元测试

     package com.liming;
     
     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 HelloApplicationTests {
     
         @Autowired
         private JavaMailSenderImpl javaMailSender;
     
         //邮件设置1:一个简单的邮件
         @Test
         void contextLoads() {
             SimpleMailMessage mailMessage = new SimpleMailMessage();
             mailMessage.setSubject("黎明,你好"); // 主题
             mailMessage.setText("这是邮件发送测试。。。"); // 正文
     
             mailMessage.setTo("2356731504@qq.com"); // 发送给谁
             mailMessage.setFrom("2356731504@qq.com"); // 谁发
             javaMailSender.send(mailMessage);
         }
     
         // 一个复杂的邮件
         @Test
         void contextLoads2() throws  MessagingException {
             MimeMessage mimeMessage = javaMailSender.createMimeMessage();
             //组装
             MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
     
             //正文
             helper.setSubject("黎明,你好~plus");
             helper.setText("<p style='color:red'>这是邮件发送测试</p>", true);
     
             //附件
             helper.addAttachment("1.jpg", new File("D:\\Users\\Pictures\\Saved Pictures\\SAP-ABAP.jpg"));
             helper.addAttachment("2.jpg", new File("D:\\Users\\Pictures\\Saved Pictures\\SAP-ABAP.jpg"));
     
             helper.setTo("2356731504@qq.com");
             helper.setFrom("2356731504@qq.com");
     
             javaMailSender.send(mimeMessage);
     
         }
     
     }
    
    

    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

线程池,以及线程池的实现以及面试常问的问题,工厂模式,常见的锁策略(面试常考,要了解,不行就背)

一、&#x1f49b; 线程池的基本介绍 内存池&#xff0c;进程池&#xff0c;连接池&#xff0c;常量池&#xff0c;这些池子概念上都是一样的&#xff5e;&#xff5e; 如果我们需要频繁的创建销毁线程&#xff0c;此时创建销毁的成本就不能忽视了&#xff0c;因此就可以使用线…

数据结构刷题训练:设计循环队列(力扣OJ)

目录 文章目录 前言 1. 题目&#xff1a;设计循环队列 2. 思路 3. 分析 3.1 定义循环队列 3.2 创建队列 3.3 判空和判满 3.4 入队 3.5 出队 3.6 取队头队尾数据 3.7 销毁队列 4. 题解 总结 前言 当谈到队列数据结构时&#xff0c;很多人可能会想到普通的队列&#xff0c;即先进…

拷贝对象时的一些编译器优化

在传参和传返回值的过程中&#xff0c;一般编译器会做一些优化&#xff0c;减少对象的拷贝&#xff0c;这个在一些场景下还是非常有用的

Linux之awk判断和循环

echo zhaoy 70 72 74 76 74 72 >> score.txt echo wangl 70 81 84 82 90 88 >> score.txt echo qiane 60 62 64 66 65 62 >> score.txt echo sunw 80 83 84 85 84 85 >> score.txt echo lixi 96 80 90 95 89 87 >> score.txt把下边的内容写入到s…

FL Studio for Windows-21.1.0.3713中文直装版功能介绍及系统配置要求

FL Studio 21简称FL水果软件,全称是&#xff1a;Fruity Loops Studio编曲&#xff0c;由于其Logo长的比较像一款水果因此&#xff0c;在大家更多的是喜欢称他为水果萝卜&#xff0c;FL studio21是目前最新的版本&#xff0c;这是一款可以让你的计算机就像是一个全功能的录音室&…

SpringBoot复习(39)Servlet容器的自动配置原理

Servlet容器自动配置类为ServletWebServerFactoryAutoConfiguration 可以看到通过Import注解导入了三个配置类&#xff1a; 通过这个这三个配置类可以看出&#xff0c;它们都使用了ConditionalOnClass注解&#xff0c;当类路径存在tomcat相关的类时&#xff0c;会配置一个T…

matlab解常微分方程常用数值解法2:龙格库塔方法

总结和记录一下matlab求解常微分方程常用的数值解法&#xff0c;本文将介绍龙格库塔方法&#xff08;Runge-Kutta Method&#xff09;。 龙格库塔迭代的基本思想是&#xff1a; x k 1 x k a k 1 b k 2 x_{k1}x_{k}a k_{1}b k_{2} xk1​xk​ak1​bk2​ k 1 h f ( x k , t …

ZDH-wemock模块

本次介绍基于版本v5.1.1 目录 项目源码 预览地址 安装包下载地址 wemock模块 wemock模块前端 配置首页 配置mock wemock服务 下载地址 打包 运行 效果展示 项目源码 zdh_web: https://github.com/zhaoyachao/zdh_web zdh_mock: https://github.com/zhaoyachao/z…

带你了解接收参数@PathVariable、@ModelAttribute 等相关注解

&#x1f600;前言 本篇博文是关于SpringBoot 接收客户端提交数据/参数会使用到的相关注解应用说明&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文…

elasticsearch 基础

ES 搜索技术历史 今天看的是《Elasticsearch实战与原理解析》 第一章 搜索技术发展史 1、搜索技术发展史 宏观而言&#xff0c;搜索引擎的发展经历了五个尖端和两大分类。五个阶段分别是ftp文件检索阶段、分类目录阶段、文本相关性检索阶段、网页链接分析阶段和用户意图识别…

警惕 C++ 中的隐式类型转换

今天文章的主题灵感来自客户的一个问题&#xff1a; 我在研究一个代码中的栈溢出问题。为了减小栈帧的大小&#xff0c;我尽可能多地删除了局部变量&#xff0c;但仍有很多栈空间无法解释。除了局部变量、参数、保存的寄存器和返回地址之外&#xff0c;栈上还有什么其他的东西…

第八章 CUDA内存应用与性能优化篇(上篇)

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…

机器学习线性代数基础

本文是斯坦福大学CS 229机器学习课程的基础材料&#xff0c;原始文件下载 原文作者&#xff1a;Zico Kolter&#xff0c;修改&#xff1a;Chuong Do&#xff0c; Tengyu Ma 翻译&#xff1a;黄海广 备注&#xff1a;请关注github的更新&#xff0c;线性代数和概率论已经更新完毕…

ACL 2023 | 使用语言模型解决数学推理问题的协同推理框架

©PaperWeekly 原创 作者 | 朱欣宇 单位 | 清华大学 研究方向 | 自然语言处理 论文标题&#xff1a; Solving Math Word Problems via Cooperative Reasoning induced Language Models 论文链接&#xff1a; https://arxiv.org/abs/2210.16257 代码链接&#xff1a; https…

2023 互联网大厂薪资大比拼

最近整理了33家互联网大厂的薪资情况。可以看出来&#xff0c;大部分互联网大厂薪资还是很不错的&#xff0c;腾讯、阿里、美团、百度等大厂平均月薪超过30k&#xff0c;其他互联网大厂平均月薪也都在25k以上。01020304050607080910111213141516171819202122232425262728293031…

ESP8266(RTOS SDK)内嵌网页以实现WEB配网以及数据交互

【本文发布于https://blog.csdn.net/Stack_/article/details/131997098&#xff0c;未经允许不得转载&#xff0c;转载须注明出处】 1、执行make menuconfig&#xff0c;将http头由512改为更大的值&#xff0c;否则用电脑浏览器访问正常&#xff0c;但用手机浏览器访问会因为ht…

关于`IRIS/Caché`进程内存溢出解决方案

文章目录 关于IRIS/Cach进程内存溢出解决方案 描述原因相关系统变量$ZSTORAGE$STORAGE 什么情况下进程内存会变化&#xff1f;内存不足原理解决方案 关于 IRIS/Cach进程内存溢出解决方案 描述 在IRIS/Cach中&#xff0c;进程内存溢出错误是指一个进程&#xff08;例如运行中的…

群晖 nas 自建 ntfy 通知服务(梦寐以求)

目录 一、什么是 ntfy ? 二、在群晖nas上部署ntfy 1. 在Docker中安装ntfy 2. 设置ntfy工作文件夹 3. 启动部署在 docker 中的 ntfy&#xff08;binwiederhier/ntfy&#xff09; 三、启动配置好后&#xff0c;如何使用ntfy 1. 添加订阅主题&#xff08; Subscribe to topic…

六种不同的CRM系统类型分别有哪些特点?

企业想要管理销售&#xff0c;可以选择CRM系统&#xff1b;企业想要优化业务流程&#xff0c;可以选择CRM系统&#xff1b;企业想要提高收入&#xff0c;可以选择CRM系统。下面来说说&#xff0c;CRM是什么&#xff1f;六种常见CRM系统类型对比。 什么是CRM&#xff1f; CRM是…