15、SpringBoot:异步、定时、邮件任务
前言
在我们的工作中,常常会用到异步处理任务,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。还有一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息。还有就是邮件的发送,微信的前身也是邮件服务呢?这些东西都是怎么实现的呢?其实 SpringBoot 都给我们提供了对应的支持,我们上手使用十分的简单,只需要开启一些注解支持,配置一些配置文件即可!那我们来看看吧~
最后编辑于 2020.3.26 作者:狂神说
15.1、异步任务
1、创建一个 service 包
2、创建一个类 AsyncService
异步处理还是非常常用的,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。
编写方法,假装正在处理数据,使用线程设置一些延时,模拟同步等待的情况;
3、编写 controller 包
4、编写 AsyncController 类
我们去写一个 Controller 测试一下
5、访问 http://localhost:8080/hello 进行测试,3 秒后出现 success,这是同步等待的情况。
问题:我们如果想让用户直接得到消息,就在后台使用多线程的方式进行处理即可,但是每次都需要自己手动去编写多线程的实现的话,太麻烦了,我们只需要用一个简单的办法,在我们的方法上加一个简单的注解即可,如下:
6、给 hello 方法添加 @Async 注解;
SpringBoot 就会自己开一个线程池,进行调用!但是要让这个注解生效,我们还需要在主程序上添加一个注解 @EnableAsync ,开启异步注解功能;
7、重启测试,网页瞬间响应,后台代码依旧执行!
15.2、定时任务
项目开发中经常需要执行一些定时任务,比如需要在每天凌晨的时候,分析一次前一天的日志信息,Spring 为我们提供了异步执行任务调度的方式,提供了两个接口。
- TaskExecutor 接口
- TaskScheduler 接口
两个注解:
- @EnableScheduling
- @Scheduled
cron 表达式:
测试步骤:
1、创建一个 ScheduledService
我们里面存在一个 hello 方法,他需要定时执行,怎么处理呢?
2、这里写完定时任务之后,我们需要在主程序上增加 @EnableScheduling 开启定时任务功能
3、我们来详细了解下 cron 表达式;
http://www.bejson.com/othertools/cron/
4、常用的表达式
15.3、邮件任务
邮件发送,在我们的日常开发中,也非常的多,Springboot 也帮我们做了支持
- 邮件发送需要引入 spring-boot-start-mail
- SpringBoot 自动配置 MailSenderAutoConfiguration
- 定义 MailProperties 内容,配置在 application.yml 中
- 自动装配 JavaMailSender
- 测试邮件发送
测试:
1、引入 pom 依赖
看它引入的依赖,可以看到 jakarta.mail
2、查看自动配置类:MailSenderAutoConfiguration
这个类中存在 bean,JavaMailSenderImpl
然后我们去看下配置文件
3、配置文件:
获取授权码:在 QQ 邮箱中的设置 -> 账户 -> 开启 pop3 和 smtp 服务
4、Spring 单元测试
查看邮箱,邮件接收成功!
我们只需要使用 Thymeleaf 进行前后端结合即可开发自己网站邮件收发功能了!