异步任务 在实际的开发过程中使用的是非常广泛的,特别是在邮件发送,数据处理的过程中,不希望影响后面的进程,我们都会采用异步任务
注意:
@Async 一定要和 @EnableAsync 搭配使用才能生效
案例:
@Service
public class AsyncService {
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据处理中...");
}
}
@RestController
public class AsyncController {
@Autowired
AsyncService service;
@GetMapping("/hello")
public String hello() {
service.hello();
return "success";
}
}
正常情况下,你访问localhost:8080/hello请求,浏览器会在3秒之后作出应答.但是,如果我们想让浏览器立即作出应答,可以采用多线程异步任务的方式,示例代码如下
@Service
public class AsyncService {
//告诉spring,这是一个异步方法,spring就会自己开一个线程池对该方法进行调用
//该注解需要和@EnableAsync搭配才会生效
@Async
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据处理中...");
}
}
修改之后,重新启动应用,浏览器不会等待而是立即应答.
@Scheduled 和 @EnableScheduling结合使用才生效
@Service
public class ScheduledService1 {
//开启基于注解的定时任务 @EnableScheduling
/**
* 需求:该方法需要定时执行
* 解决方法:在方法上标注 @Scheduled 注解,它有很多的属性,并且要和 @EnableScheduling 结合才生效
* cron : 它主要是用来指定定时任务的cron表达式 ,表达式总共6位,每位之间用空格分隔,
* second(秒) minute(分), hour(时), day of month(日), month(月) , day of week(周几).
* 实例: 0 * * * * MON-FRI : 表示周一到周五的每一分钟都执行一次, * 代表任意时刻,
* 0在那个位置,表示的都是整值启动
* (定时执行,如果上一次任务执行超时而导致某个定时间隔不能执行,则会顺延下一个定时间隔时间。下一个任务和上一个任务的间隔时间不固定)
*/
//@Scheduled(cron = "0 * * * * 0-7")
//@Scheduled(cron = "0,1,2,3,4 * * * * 0-7")
//@Scheduled(cron = "0-4 * * * * 0-7")
@Scheduled(cron = "0/4 * * * * 0-7") //o秒启动,每4秒执行一次
public void hello(){
System.out.println("hello ... ");
}
}
两个邮箱账号之间是不能直接发送邮件的,例如上图,张三想要给李四发送邮件,但是张三是QQ邮箱,李四是163邮箱,
步骤:
- 就是张三先给QQ邮箱服务器先发送邮件,
- 然后QQ邮箱服务器把这封邮件发送给163邮箱服务器
- 李四上线之后从163邮箱服务器上获取这封邮件,整个过程就结束了
小结:
发送邮件,我们需要配置的有,发件人的用户名,密码,以及发件人所在的邮箱服务器的地址
邮件任务
1,导入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-mailartifactId>
dependency>
2,进行邮件寄件人的用户名,密码,以及寄件人所在服务器的配置
spring:
mail:
username:[email protected] # 邮箱账户
password: xxXXXxxxx # 授权码
host: smtp.qq.com # 邮箱主机地址
# 如果报错503,并且提示连接不安全,可以配置下面这句话
# spring.mail.properties.mail.smtp.ssl.enable = true
3,发送简单邮件测试
@Autowired
JavaMailSenderImpl mailSender;
@Test
public void contextLoads() {
//创建一个简单邮件对象
SimpleMailMessage message = new SimpleMailMessage();
//邮件的设置
message.setSubject("通知,今晚开会"); //设置标题
message.setText("今晚7.30开会"); //设置邮件内容
message.setTo("[email protected]"); // 设置收件人
message.setFrom("[email protected]"); //设置发件人
//发送邮件
mailSender.send(message);
}
4,发送可以上传附件,以及支持HTML格式的邮件测试
/**
* 测试更加复杂的邮件
*/
@Test
public void test02() throws MessagingException {
//创建一个可以发送消息并且携带附件的邮件对象
MimeMessage mimeMessage = mailSender.createMimeMessage();
//第一个参数传入消息对象,第二个是是否支持编码
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//邮件的设置
helper.setSubject("通知,今晚开会"); //设置标题
helper.setText(" 今晚7.30 开会 ",true); //设置邮件内容
helper.setTo("[email protected]"); // 设置收件人
helper.setFrom("[email protected]"); //设置发件人
//上传文件,第一个参数是文件名,第二个参数是文件或者一个输入流
helper.addAttachment("1.jpg",new File("C:\\Users\\Desktop\\1.jpg"));
helper.addAttachment("2.jpg",new File("C:\\Users\\Desktop\\2.jpg"));
mailSender.send(mimeMessage);
}