Springboot(十六)——异步任务、邮件任务、定时任务
异步任务
1、环境搭建
2、编写service层,实现延迟3000毫秒
package com.study.service;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncService {
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理。。。。");
}
}
3、编写controller,调用service层
package com.study.controller;
import com.study.service.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AstncController {
@Autowired
AsyncService asyncService;
@RequestMapping("/hello")
public String hello(){
asyncService.hello();//延迟三秒
return "ok";
}
}
运行测试
跳转到localhost:8080/hello 的时候会延迟(转圈)三秒
解决办法,在springboot中开启异步功能
1、在主启动类开启异步功能
@SpringBootApplication
@EnableAsync //开启异步注解功能
public class Springboot09TestApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot09TestApplication.class, args);
}
}
2、在service层方法中添加注解
@Service
public class AsyncService {
//告诉spring这是一个异步的方法,执行这个方法的时候会自动开启线程池
@Async
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理。。。。");
}
}
3、运行测试
瞬间响应,进入到页面
邮件任务
发送和接收邮件
1、导入邮件依赖
<!--导入mail配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、设置QQ邮箱,开启POP3/SMTP协议
进入QQ邮箱,点击设置
点击账户
点击开启POP3/SMTP协议
获取邮箱授权码
3、编写properties
# 应用名称
spring.application.name=springboot-09-test
# 应用服务 WEB 访问端口
server.port=8080
#邮箱名称
spring.mail.username=963330213@qq.com
#邮箱密码(授权码)
spring.mail.password=toxvosulbehkbcai
#发送的服务器
spring.mail.host=smtp.qq.com
#开启加密验证
spring.mail.properties.mail.smtl.ssl.enable=true
一个简单的邮件
4、编写测试类
package com.study;
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 Springboot09TestApplicationTests {
@Autowired
JavaMailSenderImpl mailSender;
@Test
void contextLoads() {
//简单邮件
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//邮箱标题
simpleMailMessage.setSubject("邮件标题");
//邮箱内容
simpleMailMessage.setText("邮件内容");
//接受邮件
simpleMailMessage.setTo("963330213@qq.com");
//发送邮件
simpleMailMessage.setFrom("963330213@qq.com");
mailSender.send(simpleMailMessage);
}
}
5、运行测试
一个简单的邮件
编写测试类
@Autowired
JavaMailSenderImpl mailSender;
@Test
void contextLoads2() throws MessagingException {
//复杂邮件
MimeMessage mimeMessage = mailSender.createMimeMessage();
//组装
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
//邮件标题
helper.setSubject("邮件标题");
//邮件内容
helper.setText("<h1 style='color:red'>邮件内容</h1>",true);
//附件
helper.addAttachment("1.jpg",new File("C:\\Users\\Desktop\\1.jpg")); //文件地址
helper.addAttachment("2.jpg",new File("C:\\Users\\Desktop\\1.jpg"));
//发送
helper.setFrom("963330213@qq.com");
//接收
helper.setTo("963330213@qq.com");
mailSender.send(mimeMessage);
}
运行测试
定时任务
1、在主启动类添加开启定时任务功能的注解
@SpringBootApplication
@EnableAsync //开启异步注解功能
@EnableScheduling //开启定时功能
public class Springboot09TestApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot09TestApplication.class, args);
}
}
2、编写service层,测试定时任务功能
@Service
public class ScheduledService {
//@Scheduled : 什么时候执行
//在一个特定时间执行这个方法:Timer
//cron表达式 秒 分 时 日 月 星期 年(可选)
// * :任意 ?:不确定 ,任意周用 ? 表示
/*
0 35 2 * * ? 每天凌晨2:35分执行
0 0/5 10,18 * * ? 每天10点和18点,每隔5分钟执行一次
0 15 10 ? * 1-6 每个月的周一到周六10点15分执行一次
*/
//每隔两秒执行一次
@Scheduled(cron = "0/2 * * * * ?")
public void hello(){
System.out.println("hello被执行了");
}
}
3、运行测试
4、在线生成Cron表达式