今天和大家分享下昨天完成的SpringBoot中的异步任务、邮件发送任务和定时任务,我也是个回顾,大家也可以进行学习,一举两得,下面直奔主题。
1、异步任务:
首先介绍下异步是什么:举个例子吧,就是A流程请求接口B之后,不需要等待B应答,而是接着继续执行A剩余的逻辑,这样A的操作叫做异步处理。
异步的实现:在SpringBoot中,实现异步任务只需要两步,一是在添加异步注解@Async;二是开启异步任务注解@EnableAsync。代码实现如下:
在异步任务方法上进行使用@Async注解,代码如下:
package com.ygl.service;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @author ygl
* @description
* @date 2020/11/9 16:00
*/
@Service
public class AsynService{
//异步任务 注解
@Async
public void hello() throws InterruptedException {
Thread.sleep(3000);
System.out.println("数据正在处理、、、");
}
}
注意:@Async注解只能使用在public方法上
然后在启动类上开启异步任务,代码如下所示:
package com.ygl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableAsync //开启异步注解
public class Springboot09TestApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot09TestApplication.class, args);
}
}
以上就是使用异步任务你的步骤,非常简单,下面我们写个controller类来进行测试下异步任务,代码如下所示:
package com.ygl.controller;
import com.ygl.service.AsynService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author ygl
* @description
* @date 2020/11/9 16:03
*/
@RestController
public class AsyncController {
@Autowired
private AsynService asynService;
@GetMapping("/hello")
public String hello() throws InterruptedException {
asynService.hello();
return "ok";
}
}
测试可以看到,我们在注解的方法中休眠了3秒,但是在调用controller层的时候,直接返回"ok"字段,然后等3秒后才进行打印注解方法中的打印语句,说明是成功的完成异步任务。
2、邮件发送任务
邮件发送任务就是通过代码进行将邮件进行发送过去,邮件发送分为两种情况,一种是简单邮件发送,另一种位复杂邮件发送。
1、简单邮件发送
首先在pom依赖中导入mail(邮件发送)的依赖,依赖代码如下图所示:
<!-- 邮件任务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
然后在test中测试编写代码,首先需要注入邮件发送的实现类JavaMailSenderImpl javaMailSender;
代码如下图所示:
package com.ygl;
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.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
@SpringBootTest
class Springboot09TestApplicationTests {
@Autowired
JavaMailSenderImpl javaMailSender;
@Test
void contextLoads() {
//一个简单邮件发送
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//主题
simpleMailMessage.setSubject("这是邮件主题");
//内容
simpleMailMessage.setText("这是邮件内容");
//发送者
simpleMailMessage.setFrom("153911111@qq.com");
//接受者
simpleMailMessage.setTo("yan11111@163.com");
//发送
javaMailSender.send(simpleMailMessage);
}
}
2、复杂邮件发送:
首先肯定是引入依赖啦,依赖和上面的简单邮件发送依赖一样,然后接下来编写发送复杂邮件代码,代码如下:
package com.ygl;
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.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
@SpringBootTest
class Springboot09TestApplicationTests {
@Autowired
JavaMailSenderImpl javaMailSender;
@Test
void contextLoads2() throws MessagingException {
//一个复杂邮件发送
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//组装
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//正文 类似选择文件大小 字体 颜色等等
helper.setSubject("测试邮件主题plus");
//后面的true是代表开启html支持
helper.setText("<p style='color:red'>测试内容</p>",true);
//附件 文件地址
helper.addAttachment("1.jpg",new File("C:\\Users\\ygl\\Pictures\\2.jpg"));
helper.addAttachment("2.jpg",new File("C:\\Users\\ygl\\Pictures\\2.jpg"));
helper.setFrom("15391111115@qq.com");
helper.setTo("1511111@qq.com");
javaMailSender.send(mimeMessage);
}
}
对了,还有最重要的,要在yml文件中进行配置,配置代码如下:
spring:
mail:
username: 153981111@qq.com
password: tlnhbmwmoviqiaaf
#QQ邮箱这样 其余不是这样
host: smtp.qq.com
#QQ需要加密,其余邮箱不需要 开启加密验证
properties:
mail:
smtp:
ssl:
enable: true
注意: yml的配置中我这个是QQ邮箱的配置,如果大家的邮箱是网易之类的大家要记得更改哦。
3、定时任务
今天所讲的SpringBoot创建定时任务是非常简单的,基于注解的,当然还有其他两种方式,分别位基于接口和基于注解设定的多线程定时任务,这两者在这里不给大家叙述,在这里只讲第一种基于注解的方式。
基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行会受上一个任务执行时间的影响。基于注解创建的定时任务只需要两个注解,一是注解 @Scheduled,另一个注解是开启定时任务的注解@EnableScheduling。然后再在启动类上开启定时任务注解 @EnableScheduling,代码如下:
public class SchedulingService{
//3.添加定时任务
@Scheduled(cron = "0/5 * * * * ?")
//或直接指定时间间隔,例如:5秒
//@Scheduled(fixedRate=5000)
private void Scheduling() {
System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
}
}
注意: cron表达式在这里不过多描述,大家可以去进行搜索。
最后记得再在启动类上开启定时任务注解 @EnableScheduling。
大家有问题的话在下方进行评论留言,和大家一起探讨,欢迎点赞转发评论