开发过程中碰到这样一个问题:用户忘记密码后通过邮箱找回,需要向邮箱中发送一个验证码,但是发送验证码的接口耗时达到了20秒,觉得这样不太合理,点击发送邮件按钮后要等待图标转20秒,于是对发送邮箱的方法加上异步处理,执行到发送邮件的方法后,不用等待邮件发送成功,提前返回操作成功,提示用户邮件发送可能有延迟。
首先将发送邮件的代码标注出来:
/**
* 找回密码发送邮件
*
* @param email
*/
@GetMapping("/sendGetBackPwdMail")
public Object sendGetBackPwdMail(String email) {
if (StrUtil.isEmpty(email)) {
return ResultUtil.error("请输入邮箱地址");
}
if (!Validator.isEmail(email)) {
return ResultUtil.error("邮箱地址格式有误");
}
List<SysUser> sysUserList = userService.list(new QueryWrapper<SysUser>().eq("email", email));
if (sysUserList == null || sysUserList.size() == 0) {
return ResultUtil.error("该邮箱未注册");
}
//生成随机六位数字验证码
String randomNum = RandomUtil.randomNumbers(6);
//存入redis
redisTemplate.opsForValue().set(Constant.GET_BACK_PWD + email, randomNum, 10, TimeUnit.MINUTES);
//该方法为发送邮件的方法 在实现类中添加了异步注解 异步执行
mailService.sendSimpleMail(email, "xxxx系统修改密码", "您正在进行找回密码操作,验证码是" + randomNum + ",验证码有效期为10分钟。");
return ResultUtil.success();
}
以下是实现类的发送邮件方法:
/**
* 简单文本邮件
*
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
@Override
public void sendSimpleMail(String to, String subject, String content) {
//创建SimpleMailMessage对象
SimpleMailMessage message = new SimpleMailMessage();
//邮件发送人
message.setFrom(from);
//邮件接收人
message.setTo(to);
//邮件主题
message.setSubject(subject);
//邮件内容
message.setText(content);
//发送邮件
mailSender.send(message);
}
实现步骤:
1、在接口的控制类上添加注解:
@EnableAsync //这里加上注解 代表开启异步
@RestController
@RequestMapping("/simple/exclude")
public class ExcludeController {
2、在发送邮件的方法上添加注解
/**
* 简单文本邮件
* 加入异步注解 异步执行该方法
*
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
@Override
@Async//添加该注解 代表该方法异步执行
public void sendSimpleMail(String to, String subject, String content) {
System.out.println("异步任务:发送邮件开始执行");
//创建SimpleMailMessage对象
SimpleMailMessage message = new SimpleMailMessage();
//邮件发送人
message.setFrom(from);
//邮件接收人
message.setTo(to);
//邮件主题
message.setSubject(subject);
//邮件内容
message.setText(content);
//发送邮件
mailSender.send(message);
System.out.println("异步任务:发送邮件执行完毕");
}
添加以上两个注解后,即可异步发送邮件,不用等到邮件发送完毕。