文章目录
- 一 异步任务
- 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 项目创建
- 同异步任务项目创建,请参看前面的内容
- 邮件发送需要引入spring-boot-start-mail
<!--javax.mail-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
3.2 源码探究
- 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>
- 查看自动配置类: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配置文件
- 获取授权码【这里以QQ邮箱为例】
- 登录QQ邮箱
- 下滑找到如下内容,点击开启POP/SMTP服务
- 按照要求进行操作
- 获取到授权码,将其复制
- 配置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 测试
- 编写测试代码
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);
}
}
- 测试结果