Spring-Boot-Mission

Spring Boot 任务


异步任务

标注某个方法是异步方法,该方法被调用时就会异步调用,即Spring Boot 会新建一个线程来运行该方法

1
2
3
4
@Async
public void asyncMethod(){
doSomethings();
}

在主类中使用@EnableAsync来开启异步注解。

1
2
3
4
public void demo(){
asyncMethod();
doOtherthings();
}

运行时就会异步调用,既不管asyncMethod是否运行完,doOtherthings都会开始运行。

定时任务

使用@Scheduled(cron="second minute hour dayOfMonth month dayOfWeek")来指定方法在什么时间运行。其中日期和星期互斥,设置的时候至少有一个?

字段 允许值 允许的特殊字符
0-59 , - * /
0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
  • *字符代表所有可能的值

  • /字符用来指定数值的增量

    • 在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
    • 在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样
  • ?字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值

    • 当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为 ?
  • L字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写

    • 如果在“L”前有具体的内容,它就具有其他的含义了。例如:“6L”表示这个月的倒数第6天
    • 注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题
  • W 字符代表着工作日(Mon-Fri),并且仅能用于日域中。

    • 例如,日域中的 15W 意味着 “离该月15号的最近一个平日” 假如15号是星期六,那么 trigger 会在14号(星期五)触发,因为星期四比星期一离15号更近。
  • C字符代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历

    • 例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。

邮件任务

引入依赖

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>

配置用于发送的邮箱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
mail:
username: 你的邮箱
#大部分邮箱都不是用的你自己设置的邮箱密码,而是一个授权给第三方使用的授权码
password: 你的密码
#自行查阅自己的邮箱用什么主机,例如QQ邮箱是smtp.qq.com
host: 你的邮箱主机

#有些邮箱(例如QQ)还需要安全连接,例如SSL连接
properties:
mail:
smtp:
ssl:
enable: true

注入一个JavaMailSenderImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Autowired
JavaMailSenderImpl mailSender

public void sendSimpleDemo(){
SimpleMailMessage simpleMessage = new SimpleMailMessage();
simpleMessage.setSubject("simple title");
simpleMessage.setText("simple page");

//接收的邮箱
simpleMessage.setTo("target@email.com");

//发送的邮箱
simpleMessage.setFrom("source@email.com");

mailSender.send(simpleMessage);
}

如果需要发送复杂点的邮件,例如发送附件或html文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Autowired
JavaMailSenderImpl mailSender

public void sendDemo(){
MimeMessage mimeMessage = mailSender.createMimeMessage();

//第二个参数代表是否要进行编码
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setSubject("demo title");

//第二个参数代表是否html文本
helper.setText("<b style='color:red'>page</b>", true);

//第一个参数是发送的文件的新名字,后面是一个File对象或Stream对象
helper.addAttachment("attachmentFilename",new FIle("filePathName"));

//接收的邮箱
helper.setTo("target@email.com");

//发送的邮箱
helper.setFrom("source@email.com");

mailSender.send(mimeMessage);
}