验证码的异步机制
上一篇讲过可以用邮件发验证码,通常我们在某网站发验证码时,首先会提示验证码已发送,请检查邮箱或者短信,这就是图中的1和3。然而此时查看邮箱或短信可能并没有收到验证码,往往要过几秒种才真正收到,这就是图中的2和4。2和4所消耗的时间比1和3要多,如果是同步,先执行4后执行3,那么这个请求将一直占用后台服务器。如果是异步,可以在第一时间通知用户已发送,并释放请求,而完全不用去管2和4的执行过程。如果2和4执行不成功怎么办?在验证码提示消息结尾,我们经常可以看到:”如果你在XXX秒钟之内没有收到验证码,请重发“
@Async和@EnableAsync 实现异步
控制层
- @GetMapping("/async")
- public String test1() throws InterruptedException {
- helloService.task1();
- helloService.task2();
- System.out.println("释放请求");
- return "ok";
- }
- @Async
- public void task1() throws InterruptedException{
- Thread.sleep(2000);
- System.out.println("完成任务1");
- }
- @Async
- public void task2() throws InterruptedException{
- Thread.sleep(1000);
- System.out.println("完成任务2");
- }
上图是执行结果 ,这是同步。如果要让@Async异步生效还需要在配置类中开启异步,如下
- @EnableAsync
- @SpringBootApplication
执行顺序和前面完全颠倒,在第一时间就释放了请求,任务2和任务1是同时执行的,但是任务2时间短,所以比任务1先执行完。