查看原文
其他

玩转springboot2.x之异步调用@Async

桌前明月 Java学习之道 2022-08-24

点击上方"Java学习之道",选择"关注"公众号

每天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;

@SpringBootApplication
@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 方法....
    @Override
    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;

@Service
public class UserService {
    Logger log = LoggerFactory.getLogger(UserService.class);
    @Autowired
    private UserDao userDao;
    @Autowired
    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;

@Service
public class MailService {
    Logger log = LoggerFactory.getLogger(MailService.class);

    @Async
    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;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/addUser")
    public String addUser(User user) throws InterruptedException {
        long time = userService.addUser(user);
        return  "注册耗时:"+time;
    }
}

进行测试:

启动我们的服务 通过游览器访问我们添加用户Controller 具体操作结果如下:

我的后台控制期打印日志内容如下:


项目源码地址:

    https://github.com/zhuoqianmingyue/springbootexamples


往期回顾:

玩转springboot2.x之整合邮件发送篇

●玩转springboot2.x之使用JSP篇

玩转springboot2.x之整合mybatis篇

●玩转springboot2.x之自定义Filter过滤器篇

●玩转springboot2.x之使用SpringDateJpa篇

玩转springboot2.x之搭建Actuator和spring boot admin监控篇

玩转springboot2.x之整合webSocket篇

●玩转springboot2.x之整合swagger篇

玩转SpringBoot2.x之定时任务详解

玩转springboot2.x之整合JWT篇

玩转springboot2.x之整合freemarker

玩转springboot2.x之IntellJ IDEA快速搭建

玩转springboot2.x之restful api开发篇

●你真的会高效的在GitHub搜索开源项目吗?

-END-

    喜欢本文的朋友们,欢迎扫码关注订阅号Java学习之道,收看更多精彩内容!


    一  起努力吧!


你也可以顺手点个在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存