文章目录
- Spring Boot——完成异步任务,定时执行任务以及邮件发送任务
- 1、异步任务
- 2、邮件发送任务
- 3、定时执行任务
Spring Boot——完成异步任务,定时执行任务以及邮件发送任务
1、异步任务
根据Spring的文档说明,默认采用的是单线程的模式的。所以在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的。那么当多个任务的执行势必会相互影响。例如,如果A任务执行时间比较长,那么B任务必须等到A任务执行完毕后才会启动执行。又如在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring3.x
之后,已经内置了@Async来完美解决这个问题。
- 异步调用:接收到指令就执行,无需等待
- 同步调用:顺序执行,需等待上一个任务执行完毕
启动类加上注解:@EnableAsync
@EnableAsync//开启异步功能
@SpringBootApplication
public class Springboot09TaskApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot09TaskApplication.class, args);
}
}
异步执行的方法上加上**@Async**注解
@Service
public class AsyncService {
@Async//告诉springboot这是一个异步方法,可以在注解内加上自定义的线程池,不加就使用默认的
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("正在加载。。。。。");
}
}
controller执行异步方法
@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;
@RequestMapping("/hello")
public String hello(){
asyncService.hello();//延迟3秒
return "hello";//响应‘hello’
}
}
在不使用异步注解时,页面要转三秒才能响应‘hello’,然后再输出"正在加载。。。。。",
使用异步注解后,页面先响应‘hello’,三秒后再输出"正在加载。。。。。",说明这两个操作异步执行了。
2、邮件发送任务
进入邮箱–设置–账户–开启服务–POP3/SMTP
导入发送邮件模块
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
在配置文件中配置邮件相关信息
=dpmipvyksstldejap.qq.com
#开启加密验证功能
spring.mail.properties.mail.smtp.ssl.enable=true
在测试类中测试邮件发送功能
package com.cheng;
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.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
@SpringBootTest
class Springboot09TaskApplicationTests {
//Spring提供了非常好用的JavaMailSender接口实现邮件发送
@Autowired
JavaMailSender javaMailSender;
@Test
void contextLoads() {
//一封简单的邮件
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//邮件主题
simpleMailMessage.setSubject("万里顾一程,你好");
//邮件内容
simpleMailMessage.setTssage);
}
@Test
void contextLoads2() throws MessagingException {
//一封复杂的邮件
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//组装 , true开启多文件支持
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
//正文
helper.setSubject("万里顾一程,你好");
helper.setText("<h1 style='color:red'>这是发给万里顾一程的邮件,本人亲启</h1>",true);//true:支持解析成html格式
//添加附件,绝对地址
helper.addAttachment("wanli.jpg",new File("C:\\Users\\Administrator\\Desktop\\4.16.png"));
//邮件发给谁ssage);
}
}
3、定时执行任务
在主启动类上添加注解
@EnableScheduling//开启定时执行任务的功能
定时执行的方法加注解 @Scheduled:
//秒 分 时 日 月 周几
@Scheduled(cron = "*/2 * * * * ?")//cron表达式:每隔2秒执行一次
public void hello(){
System.out.println("已发送");
}
CRON表达式是一个字符串,包含五个到七个由空格分隔的字段(每种软件不一样),表示一组时间,通常作为执行某个程序的时间表。
Cron语法格式,共7个部分(域)组成:最后一个不常用,所以一般都是六个部分
- Seconds(秒) Minutes(分钟) Hours(小时) DayofMonth(天/几号) Month(月) DayofWeek(星期几) Year(年)
- 每一个域可出现的字符如下:
- Seconds:可出现", - * /",有效范围为0-59的整数
- Minutes:可出现", - * /",有效范围为0-59的整数
- Hours:可出现", - * /",有效范围为0-23的整数
- DayofMonth(天/几号):可出现", - * / ? L W C",有效范围为0-31的整数
- Month:可出现", - * /",有效范围为1-12的整数
- DayofWeek(星期几) :可出现", - * / ? L C #",有效范围为1-7的整数或SUN-SAT(星期天开始)两个范围,其中1
- Year:可出现", - * /"
下面是一些常用的Cron表达式例子: 注:dayofweek 和 dayofmouth必须有一个为?
- 每隔10秒执行一次:*/10 * * * * ?
- *每隔10分钟执行一次:0 /10 * * * ?
- 每天10点执行一次:0 0 10 * * ?
- 每月1号凌晨1点执行一次:0 0 1 1 * ?
- 每月最后一天10点执行一次:0 0 10 L * ?
- 每周星期天凌晨1点执行一次:0 0 1 ? * L
- 在26分、28分、30分执行一次:0 26,28,30 * * * ?
- 0 * 15 * * ? 每天下午15点钟开始到15点59分结束这么一个时间段
- 0 0/5 15 * * ? 每天下午15点到15点55分之间每5分钟触发一次
- 0 0/5 15,18 * * ? 每天下午15点到15点55分 和18点到18点55分之间 每5分钟触发一次
- 0 0-5 15 * * ? 每天下午15点开始到15点05结束
- 0 10,30 15 ? 3 WED 每年三月份的每个周三下午15点10分和15点30各一次
- 0 15 10 ? * MON-FRI 每个工作日的10点15分
- 0 15 10 15 * ? 每个月15号的上午10点15分
- 0 15 10 L * ? 每个月最后一天的10点15分
- 0 15 10 ? * 6L 每个月最后一个周五的10点15分
- 0 15 10 ? * 6L 2002-2005 2002年到2005年每个月最后一个周五的10点15分
- 0 15 10 ? * 6#3 每个月的第三个周五的10点15分
- 0 0 12 1/5 * ? 每个月从第一天开始每隔5天中午12点触发一次
- 0 11 11 11 11 ? 每年11月11号11点11分