SpringBoot 异步、邮件任务

异步任务

  1. 创建一个Hello项目

  2. 创建一个类AsyncService

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

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

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

    我们去写一个Controller测试一下

    java 复制代码
    @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注解;

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

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

    java 复制代码
    @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依赖

    xml 复制代码
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>

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

    xml 复制代码
    <dependency>
       <groupId>com.sun.mail</groupId>
       <artifactId>jakarta.mail</artifactId>
       <scope>compile</scope>
    </dependency>
  2. 查看自动配置类:MailSenderAutoConfiguration

    这个类中存在bean,JavaMailSenderImpl

    然后我们去看下配置文件

    java 复制代码
    @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. 配置文件:

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

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

  4. Spring单元测试

    java 复制代码
     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);
     
         }
     
     }


相关推荐
無限進步D37 分钟前
Java 运行原理
java·开发语言·入门
難釋懷39 分钟前
安装Canal
java
是苏浙40 分钟前
JDK17新增特性
java·开发语言
不光头强43 分钟前
spring cloud知识总结
后端·spring·spring cloud
GetcharZp4 小时前
告别 Python 依赖!用 LangChainGo 打造高性能大模型应用,Go 程序员必看!
后端
阿里加多4 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
likerhood4 小时前
java中`==`和`.equals()`区别
java·开发语言·python
小小李程序员4 小时前
Langchain4j工具调用获取不到ThreadLocal
java·后端·ai