任务(异步,定时,邮件)
异步任务~
- 多线程来实现
定时任务~
- timer
- 表达式~
邮件发送~
- 时间
- pop3/SMTP服务
一、异步任务(async)
1.应用场景
1. 发送邮件需要时间,开异步,让用户先收到已发送邮件的信息,然后另一个线程在发邮件的等候时间后发送成功
2.案例
- 模拟一个定时3秒钟的延迟操作,然后显示ok到页面前延迟,现在:要让显示ok一个线程,延迟3秒另一个线程【如果不加就会先加载3秒后才出来ok字样,影响用户体验】
-
先写模拟代码
-
service包下的AsyncService @Service public class AsyncService { public void delay(){ try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("数据正在处理。。。"); } }
-
controller包下的AsyncController @RestController public class AsyncController { @Autowired AsyncService asyncService; /* * 要实现的就是一个线程直接输出ok,另一个线程去做延迟3秒的操作【不影响用户体验】 * */ @RequestMapping("/delay") public String delay(){ //调用这个方法就会延迟3秒钟, asyncService.delay(); return "ok"; } }
-
-
在delay方法上告诉Spring这是一个异步的方法
-
【
@Async
注解】 -
加了这个注解,只要程序运行就会给我们开启几个线程池
-
需要在主方法中开启异步注解功能
-
service包下的AsyncService @Service public class AsyncService { //在delay方法上告诉Spring这是一个异步的方法 @Async public void delay(){ try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("数据正在处理。。。"); } }
-
-
一旦加了这个注解,就要在main方法中**【开启异步注解功能】**
-
【
@EnableAsync
注解】 -
//开启异步注解功能 @EnableAsync @SpringBootApplication public class Springboot09AsyncApplication { public static void main(String[] args) { SpringApplication.run(Springboot09AsyncApplication.class, args); } }
-
二、邮件发送
1. 配置jar包
2.这里用qq发送
- qq邮箱的账户页面找到开启协议服务
- 会生成一个密码来代替自身明文密码
3.配置application.yaml
spring:
mail:
username: 834399035@qq.com
#配置的动态密码
password: kcsigtxaclybbfdj
#配置发送的服务器
host: smtp.qq.com
# 设置开启ssl
properties:
mail:
stmp:
ssl:
enable: true
##下面这些视情况开启
# 协议 默认就是smtp
#protocol: smtp
#default-encoding: utf-8
#port: 465
# qq邮箱需要...开启邮箱验证
#properties.mail.smtp.ssl.enable=true
#port: 587
4.Test测试中写发送邮件的测试【这里先写到Test中,后面要写到controller或者service中】
@SpringBootTest
class Springboot09AsyncApplicationTests {
@Autowired
JavaMailSenderImpl javaMailSender;
@Test
void contextLoads() {
//一个简单的邮件
SimpleMailMessage mailMessage = new SimpleMailMessage();
//标题
mailMessage.setSubject("你好");
//内容
mailMessage.setText("你电脑涉嫌窃取国家机密");
mailMessage.setSentDate(new Date());
//给送给谁
mailMessage.setTo("496228526@qq.com");
//从哪里发送
mailMessage.setFrom("834399035@qq.com");
javaMailSender.send(mailMessage);
}
}
5.写一个复杂的邮件发送【这里先写到Test中,后面要写到controller或者service中】
@Test
void contextLoads2() throws MessagingException {
//一个复杂的邮件发送
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//组装(这里需要抛出异常)
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//正文
helper.setSubject("你好g1x");
helper.setText("一个复杂的邮件发送(加附件的)");
//附件
helper.addAttachment("2.jpg", new File("E:\\pictureOrFilms\\picture\\dota\\2.jpg"));
helper.addAttachment("3.jpg", new File("E:\\pictureOrFilms\\picture\\dota\\3.jpg"));
//发送
helper.setFrom("834399035@qq.com");
helper.setTo("834399035@qq.com");
javaMailSender.send(mimeMessage);
}
6.写成一个工具类【也就是写成一个方法】
/** * * @param html :第一个参数:是否支持多文本上传哪里true改为html * @param subject :标题 * @param text :正文 * @throws MessagingException * @Author g1x :后面类比看自己需要 */ public void sendMail(Boolean html, String subject, String text) throws MessagingException { //一个复杂的邮件发送 MimeMessage mimeMessage = javaMailSender.createMimeMessage(); //组装(这里需要抛出异常) MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, html); //正文 helper.setSubject(subject); helper.setText(text); //附件 helper.addAttachment("2.jpg", new File("E:\\pictureOrFilms\\picture\\dota\\2.jpg")); helper.addAttachment("3.jpg", new File("E:\\pictureOrFilms\\picture\\dota\\3.jpg")); //发送 helper.setFrom("834399035@qq.com"); helper.setTo("834399035@qq.com"); javaMailSender.send(mimeMessage); }
三、定时任务
*两个核心的接口
TaskScheduler //任务调度程序TaskExecutor //任务执行者
1.主运行方法上要加的注解
@EnableScheduling //开启定时的注解功能@Scheduled //什么时候执行----------------------//开启异步注解功能@EnableAsync@SpringBootApplication//开启定时的注解功能@EnableSchedulingpublic class Springboot09AsyncApplication { public static void main(String[] args) { SpringApplication.run(Springboot09AsyncApplication.class, args); }}
3.@Scheduled中使用cron表达式
-
这个
cron表达式
可以在网上生成:https://cron.qqe2.com/ -
cron表达式
也有很多例子:https://www.cnblogs.com/yanghj010/p/10875151.html -
//Service层编写@Servicepublic class ScheduledService { //cron 表达式 //秒 分 时 日 月 周几 //后面代表的是全部 @Scheduled(cron = "0 35 17 * * ?") public void hello(){ System.out.println("hello,你被执行了!"); }}