异步任务、定时任务、邮件发送
异步任务
- 启动类添加@EnableAsync注解,代表启用异步
- service处理类方法添加@Async,标识该方法为异步处理
定时任务
启动任务调度
启动类添加@EnableScheduling注解,表示开启任务调度
编写任务调度类运行
@Component
public class TestTask {
//表示每10秒执行一次
@Scheduled(cron = "0/10 * * * * ?")
public void testScheduled(){
System.out.println(new Date());
}
}
cron基本学习
cron一共为六个参数,分别为:秒 分 时 日 月 周几
取值如下:
| 字段 |
允许值 |
允许的特殊字符 |
| 秒(Seconds) |
0~59的整数 |
, - * / 四个字符 |
| 分(Minutes) |
0~59的整数 |
, - * / 四个字符 |
| 小时(Hours) |
0~23的整数 |
, - * / 四个字符 |
| 日期(DayofMonth) |
1~31的整数(但是你需要考虑你月的天数) |
,- * ? / L W C 八个字符 |
| 月份(Month) |
1~12的整数或者 JAN-DEC |
, - * / 四个字符 |
| 星期(DayofWeek) |
1~7的整数或者 SUN-SAT (1=SUN) |
, - * ? / L C # 八个字符 |
| 年(可选,留空)(Year) |
1970~2099 |
, - * / 四个字符 |
cron在线生成
https://www.matools.com/cron
邮件发送
依赖添加
<!--邮件依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
yaml文件配置
spring:
mail:
username: 1******9@qq.com
password: k******b
# 配置 SMTP 服务器地址
host: smtp.qq.com
# 默认的邮件编码为UTF-8
default-encoding: UTF-8
# 端口号465或587
#port: 587 默认不指定
# 配置SSL 加密工厂
properties:
mail:
smtp:
socketFactoryClass: javax.net.ssl.SSLSocketFactory
#表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
debug: true
端口号指定
126邮箱SMTP服务器地址:smtp.126.com,端口号:465或者994
163邮箱SMTP服务器地址:smtp.163.com,端口号:465或者994
yeah邮箱SMTP服务器地址:smtp.yeah.net,端口号:465或者994
qq邮箱SMTP服务器地址:smtp.qq.com,端口号465或587*
发送简单的文本邮件
//注入邮件发送对象
@Autowired
private JavaMailSender javaMailSender;
public void sendMail(){
//构建一个邮件对象
SimpleMailMessage smm=new SimpleMailMessage();
//主题
smm.setSubject("这是一封学习的测试邮件");
// 设置邮件发送者,这个跟application.yml中设置的要一致
smm.setFrom("1******9@qq.com");
//邮件接收者,多个以逗号隔开
smm.setTo("l******u@163.com","9******1@qq.com");
//邮件抄送人
smm.setCc("1******9@qq.com");
//邮件隐秘抄送人
//smm.setBcc("");
//设置邮件的发送日期
smm.setSentDate(new Date());
//邮件正文
smm.setText("只要学不死,就往死里学!");
javaMailSender.send(smm);
}
发送带附件的邮件
public void sendMail(){
//构建一个复杂邮件对象
MimeMessage mm=javaMailSender.createMimeMessage();
try {
//创建设置参数的对象,true表示构建一个可以带附件的邮件
MimeMessageHelper mmh=new MimeMessageHelper(mm,true);
//主题
mmh.setSubject("这是一封学习带附件的测试邮件");
// 设置邮件发送者,这个跟application.yml中设置的要一致
mmh.setFrom("1******9@qq.com");
//邮件接收者,多个以逗号隔开
mmh.setTo(new String[]{"l******u@163.com","1******9@qq.com"});
//邮件抄送人
mmh.setCc("1******9@qq.com");
//设置邮件的发送日期
mmh.setSentDate(new Date());
//邮件正文
mmh.setText("只要学不死,就往死里学!");
// 第一个参数是自定义的名称,后缀需要加上,第二个参数是文件的位置
mmh.addAttachment("jdkApi.zip",new File("D:\\lwp\\API.zip"));
javaMailSender.send(mm);
} catch (MessagingException e) {
e.printStackTrace();
}
}
发送主题内容带图片
//邮件正文,true代表这是一个html文本
mmh.setText("<p>只要学不死,就往死里学!</p> <img src='cid:cs' />",true);
//第一个参数和-->img的src="cid:cs"必须一一对应
mmh.addInline("cs",new FileSystemResource(new File("D:\\lwp\\cs.jpg")));
使用Thymeleaf作为邮件模板
添加Thymeleaf依赖
<!--Thymeleaf依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
配置模板
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
h1 {
color: red;
}
h2 {
color: yellow
}
</style>
</head>
<body>
<h1>只要学不死,就往死里学!</h1>
<h2>啊哈哈哈哈哈哈</h2>
<h1>动态数据:<p th:text="${text}"></p></h1>
</body>
</html>
邮件发送
//注入邮件发送对象
@Autowired
private JavaMailSender javaMailSender;
//template模板引擎
@Autowired
private TemplateEngine templateEngine;
public void sendMail(){
//构建一个复杂邮件对象
MimeMessage mm=javaMailSender.createMimeMessage();
try {
//创建设置参数的对象,true表示构建一个可以带附件的邮件
MimeMessageHelper mmh=new MimeMessageHelper(mm,true);
//主题
mmh.setSubject("这是一封学习使用Thymeleaf模板的测试邮件");
// 设置邮件发送者,这个跟application.yml中设置的要一致
mmh.setFrom("1******9@qq.com");
//邮件接收者,多个以逗号隔开
mmh.setTo(new String[]{"l******u@163.com"});
//创建对象动态为模板传入数据
//Context是导这个包import org.thymeleaf.context.Context;
Context context=new Context();
Map<String, Object> variables=new HashMap<>();
//map的key和模板中绑定的变量对应
variables.put("text","这是一个自定义动态数据");
context.setVariables(variables);
//获取thymeleaf的html模板
//参数1:相对路径为resources/templates 自定义的mail文件夹下的mail.html
//参数2:动态数据传入
String emailContent=templateEngine.process("/mail/mail",context);
//邮件正文,第二个参数必须设置为true,表式为html文本
mmh.setText(emailContent,true);
javaMailSender.send(mm);
} catch (MessagingException e) {
e.printStackTrace();
}
}