异步任务
在开发中,我们可能经常会遇到一些需要执行时间很长的任务,如果体现在前端,会让用户一直卡在那儿等待或者一直转圈圈,体验非常不好。而异步任务就可以自己新开一个线程去执行该任务,就不会出现长时间等待的问题。
- 这里直接以例子来感受什么是异步任务
@Service public class AsyncService { @Async public void hello(){ try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("数据正在处理"); } }
- 在main中使用@EnableAsync开启异步功能
@EnableAsync @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
- 最后写一个controller进行测试,代码如下
@RestController public class AsyncController { @Autowired AsyncService asyncService; @GetMapping("/hello") public String hello(){ asyncService.hello(); return "ok"; } }
- 此时使用浏览器访问http://localhost:8080/hello会立马显示ok字段,而不需要等待4秒,这就是异步的作用。如果没有开启异步功能,浏览器访问时会延迟4秒才显示ok字段
邮件发送任务
- 导入依赖javax.mail
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
- 在邮箱中开启POP3/SMTP服务,并记录生成的密码(以qq邮箱为例)
- 配置application文件,填入邮箱用户名和刚刚开启服务得到的密码。若是qq邮箱还要开启加密授权验证,其他邮箱不需要
spring.mail.username=XXXX spring.mail.password=XXX spring.mail.host=smtp.qq.com # 开启加密授权验证 spring.mail.properties.mail.smtp.ssl.enable=true
- 使用JavaMailSenderImpl、SimpleMailMessage、MimeMessage、MimeMessageHelper类来进行邮件发送
SimpleMailMessage和MimeMessageHelper类中都包含一系列的设置邮件的方法,查看源码可得
- 发送简单邮件
class test { @Autowired JavaMailSenderImpl mailSender; // 简单的邮件 void simpleMail() { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); // 设置邮件主题 simpleMailMessage.setSubject("你好呀"); // 设置邮件内容 simpleMailMessage.setText("x”); // 收件人邮箱 simpleMailMessage.setTo("xxxx"); // 发件人邮箱 simpleMailMessage.setFrom("xxx"); mailSender.send(simpleMailMessage); } }
- 发送复杂邮件,需要借用MimeMessageHelper类来实现
可以进一步将方法抽象出来,方便以后二次调用class test { @Autowired JavaMailSenderImpl mailSender; // 简单的邮件 void mineMail() { // 创建复杂邮件 MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true); // true代表支持多文本上传 // 设置标题 mimeMessageHelper.setSubject("你好"); // true代表可以支持解析html标签 mimeMessageHelper.setText("<p style='color:blue'>你被北大录取了</p>",true); // 添加附件,这里的xxxx可以使用本地文件的绝对路径来代替 mimeMessageHelper.addAttachment("1.jpg",new File("xxxx")); // 收件人邮箱 mimeMessageHelper.setTo("xxx"); // 发件人邮箱 mimeMessageHelper.setFrom("xxx"); mailSender.send(mimeMessage); }
public void sendMail(boolean html,String subject,String text,String fileName,String filePath,String setTo,String setFrom) throws MessagingException { // 创建复杂邮件 MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,html); // true代表支持多文本上传 // 设置邮件标题 mimeMessageHelper.setSubject(subject); // true代表可以支持解析html标签,设置邮件内容 mimeMessageHelper.setText(text,true); // 添加附件 mimeMessageHelper.addAttachment(fileName,new File(filePath)); mimeMessageHelper.setTo(setTo); mimeMessageHelper.setFrom(setFrom); mailSender.send(mimeMessage); }
定时任务
使用到的东西:
- 两个接口:TaskScheduler(任务调度)和TaskExecutor(任务执行)
- @EnableScheduling (开启定时功能,加在main方法前面)
- @Scheduled(什么时候执行,加在要定时执行的方法前面 )
- cron表达式,可以去百度找cron表达式在线生成器,也可以自学如何写
- 使用@EnableScheduling注解开启定时功能
@EnableScheduling //开启定时功能 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
- 使用@Scheduled注解和Cron表达式来指定什么时候执行这段代码
package com.example.demo.service; @Service public class ScheduledService { // 这里表示每天 12:53执行这段代码 // 秒 分 时 日 月 周 @Scheduled(cron="0 53 12 * * *") // 括号里面写cron表达式 public void hello(){ System.out.println("hello"); } }