- 在项目中,我们一般会和第三方去交互,比如发送短信验证码,比如发送邮件,那么,在请求这些第三方时,有可能就会造成等待,那么对用户的体验是非常不好的,那么就需要我们异步去执行这些浪费时间的操作,而不需要一直等待堵塞到那里,那在spring boot 里面是如何实现的那?利用Async
- 在启动项中开启异步@EnableAsync(proxyTargetClass=true)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3a28ec200c10fc0b9c2ff77b3b2aad17.png)
- server层
import org.springframework.scheduling.annotation.Async;
public interface AsyncServer {
@Async
void SendMail(String mail, String randomNum);
@Async
void SendMessage();
}
import com.automobile.biz.server.AsyncServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncServerImpl implements AsyncServer {
@Autowired
private JavaMailSenderImpl mailSender;
@Value("${spring.mail.username}")
private String mailFrom;
@Override
@Async
public void SendMail(String mail, String randomNum){
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(mailFrom);
message.setTo(mail);
message.setSubject("xxxx");
message.setText("xxxx邮件,请在该平台填写验证码:" + randomNum);
try {
mailSender.send(message);
} catch (MailException e) {
e.printStackTrace();
}
}
@Override
@Async
public void SendMessage(){
System.out.println("我就是一个发送短信的模板!");
}
}
- 另一个server层中调用
@Override
public RetInfo SendMailLogic(String mailbox){
asyncServer.SendMail(mailbox, randomString);
return RetInfo.success();
}
- 注意事项:异步类和调用类不可放在一个类中,比如上面的例子调用时使用this.SendMail(mailbox, randomString);去调用,那么被调用方法 和 调用处的代码都处在同一个类,所以只是相当于本类调用, 从而@Async并不会产生效果,还相当于同步