玩转springboot2.x之异步调用@Async
每天10:24,干货准时送达!
文章已获得原作者独家授权,原文地址:
https://blog.csdn.net/ljk126wy/article/details/87989647
0、序言
我们在正常开发中一般都是通过同步的方式进行处理的,但是有时候执行多个任务并不是都需要一起执行完才行,采取异步的方式可以有效提升一个请求响应的时间。例如我们进行用户注册,如果是通过邮箱注册一般会发送激活邮件,系统添加用户信息到数据库和发送邮件这2个任务完全可以分开来做,这样用户可以很快接受到注册成功的消息。
接下来就是 SpringBoot 异步编程具体操作。
SpringBoot 异步编程拢共分2步。
1、在SpringBoot 启动类上声明@EnableAsync
具体代码如下:
package cn.lijunkui;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
//开启异步调用
public class SpringbootexamplesApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootexamplesApplication.class, args);
}
}
2、在需要进行异步处理的方法上声明@Async
我们模拟一下用户注册流程代码 添加用户到数据库和邮件发送都都通过打印信息来进行展示。不再进行数据库和邮件发送配置相关操作了。
我们用户注册到数据库采用同步方式 我们发送邮件需要采取异步,所以我们需要在邮件服务发送邮件的方法上声明@Async。具体演示类代码如下:
用户类代码如下:
package cn.lijunkui.user.model;
public class User {
private String name;
private Integer age;
//省略get and set 方法....
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
用户Dao类:
package cn.lijunkui.user.dao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import cn.lijunkui.user.model.User;
@Repository
public class UserDao {
Logger log = LoggerFactory.getLogger(UserDao.class);
public void insert(User user) {
log.info("添加用户成功 用户信息 {}",user.toString());
}
}
用户服务类:
package cn.lijunkui.user.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.lijunkui.user.dao.UserDao;
import cn.lijunkui.user.model.User;
public class UserService {
Logger log = LoggerFactory.getLogger(UserService.class);
private UserDao userDao;
private MailService mailService;
public long addUser(User user) throws InterruptedException{
long startTime = System.currentTimeMillis();
userDao.insert(user);
mailService.send(user);
long endTime = System.currentTimeMillis();
log.info("注册耗时:"+(endTime - startTime));
return (endTime - startTime);
}
}
用户邮箱服务类:
邮箱服务类发送邮箱方法send 声明@Async 并在方法内通过 Thread.sleep(2000); 延时2秒操作。
package cn.lijunkui.user.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import cn.lijunkui.user.model.User;
public class MailService {
Logger log = LoggerFactory.getLogger(MailService.class);
public void send(User user) throws InterruptedException {
long start = System.currentTimeMillis();
Thread.sleep(2000);
long end = System.currentTimeMillis();
log.info("发送激活邮箱成功!"+(end-start)+"ms");
}
}
用户Controller:
package cn.lijunkui.user.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.lijunkui.user.model.User;
import cn.lijunkui.user.service.UserService;
public class UserController {
private UserService userService;
public String addUser(User user) throws InterruptedException {
long time = userService.addUser(user);
return "注册耗时:"+time;
}
}
进行测试:
启动我们的服务 通过游览器访问我们添加用户Controller 具体操作结果如下:
我的后台控制期打印日志内容如下:
项目源码地址:
https://github.com/zhuoqianmingyue/springbootexamples
●玩转springboot2.x之自定义Filter过滤器篇
●玩转springboot2.x之使用SpringDateJpa篇
●玩转springboot2.x之搭建Actuator和spring boot admin监控篇
●玩转springboot2.x之IntellJ IDEA快速搭建
喜欢本文的朋友们,欢迎扫码关注订阅号Java学习之道,收看更多精彩内容!
一 起