原创
Spring Boot 任务
异步任务
1、创建一个Spring Boot 项目
image-20240513161752343
2、 编写模拟业务
image-20240513162010174
TaskService
TaskController@Service
public class TaskService {
// 测试异步开启
public void task(){
System.out.println(“处理前......”);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“处理后......”);
}
}
TaskController
@RestController
public class TaskController {
@Autowired
TaskService taskService;
@RequestMapping("/task")
public String task(){
taskService.task();
return "ok";
}
}
启动访问测试:
image-20240513162122361
访问的时候,右上角会转圈,当等待5s后才响应前端数据
3、解决方案一
使用多线程解决问题:
修改service层代码:
@Service
public class TaskService {
// 测试异步开启
public void task(){
new Thread(() -> {
System.out.println(“处理前......”);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“处理后......”);
}).start();
}
}
重启访问:
image-20240513162312988
点击访问立马出来结果;
但是这种方式比较麻烦,这时就可以使用Springboot 自带的异步任务开启功能。
4、Spring Boot 开启异步任务
直接在方法上面使用注解: @Async
// 测试异步开启
@Async
public void task(){
System.out.println(“处理前......”);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“处理后......”);
}
但是想使用异步功能需要再启动类上添加注解: @EnableAsync
image-20240513162510623
重启访问:
image-20240513162531291
同样实现秒访问成功。
定时任务
开启定时任务功能:@EnableScheduling
image-20240513171446207
编写测试代码:
@Service
public class TimedTasksService {
// 参数介绍 秒(0~59) 分(0~59) 时(0~24) 日(1~31) 月(1~12) 周(0~7: 0 和 7 都代表周日)
@Scheduled(cron = “0 21 17 * ”) // 这里表示 每周的每月每日的14:021:00 执行这段代码
public void timedTasks(){
System.out.println(“hello ........”);
}
}
当前系统时间:
image-20240513172010450
查看控制台输出:
image-20240513172106663
image-20240513172109869
时间匹配:自动执行了方法。
其他时间格式编写,请参考:网页链接
在线生成器地址:网页链接
邮件发送
首先需要使用邮件服务,需要去对应服务商申请邮件发送秘钥:
然后导入邮件服务所需的依赖:
[HTML_REMOVED]
[HTML_REMOVED]org.springframework.boot[HTML_REMOVED]
[HTML_REMOVED]spring-boot-starter-mail[HTML_REMOVED]
[HTML_REMOVED]
配置所需的所有配置:
spring:
# 邮件发送配置
mail:
default-encoding: UTF-8 # 编码
host: smtp.qq.com # 发送的服务商
port: 587 # 端口号
username: # 发件人邮箱
password: # 秘钥
properties: # 开启加密验证
mail.mtp.ssl.enbale: true
编写一个uitl方法:
@Component
public class Mail {
@Autowired
private JavaMailSenderImpl mailSender;
/**
* 发送邮件工具类
* @param email 接收者的邮箱账号
* @param subject 邮件标题
* @param text 邮件内容
*/
public void mailText(String email, String subject, String text){
try {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setFrom("444915368@qq.com"); // 发送者
mailMessage.setTo(email);
mailMessage.setSubject(subject);
mailMessage.setText(text);
mailSender.send(mailMessage);
} catch (Exception e) {}
}
}
编写controller测试访问:
@RestController
public class TaskController {
@Autowired
Mail mail;
@RequestMapping("/testEmail")
public String task(){
mail.mailText("444915368@qq.com", "标题", "内容");
return "ok";
}
}
image-20240513164217695
访问成功:
查看邮箱收到的邮件
image-20240513164245554
发送复杂邮件:
/*
* 发送邮件工具类
* @param email 接收者的邮箱账号
* @param subject 邮件标题
* @param text 邮件内容
* @param files 所有附件文件
/
public void mailText(String email, String subject, String text, String[] files){
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
// 参数(1. 创建的对象 2. 是否开启多文件 3. 邮件编码(不写就是默认编码))
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "utf-8");
helper.setFrom("444915368@qq.com");
helper.setTo(email);
helper.setSubject(subject);
// 第二个参数为true 表示邮件内容可以被解析为Html
helper.setText(text, true);
for (int i = 0; i < files.length; i++) {
// 添加一个附件 参数(1. 附件的名称, 2. 附件的文件地址)
helper.addAttachment(files[i].substring(files[i].lastIndexOf("\\")), new File(files[i]));
}
mailSender.send(mimeMessage);
} catch (Exception e) {}
}
测试controller
@RestController
public class TaskController {
@Autowired
Email email;
@RequestMapping("/testEmail")
public String task(){
email.mailText("444915368@qq.com", "标题", "<h1 style='color: red;'>内容</h1>", new String[]{"E:\\重要文件\\头像\\huaijiu.jpg"});
return "ok";
}
}
访问测试:
image-20240513165558490
查看邮件内容
image-20240513170010178
预览附件:
image-20240513170031363
[HTML_REMOVED]
666535