作者:刘哈哈wx:L065517
Spring Boot 实现异步方法
Spring文档: https://spring.io/guides/gs/async-method
Http工具: https://blog.csdn.net/qq_29323645/article/details/105536662
创建SpringBoot: https://blog.csdn.net/u013521220/article/details/107075949
参考: Spring 文档
本文章将参考Spring 文档,简单的为您介绍Spring 异步函数的使用方式。
环境
IDEA : 2020.3.3
jdk-version: 1.8
SpringBoot: 2.3.7.RELEASE
gradle-version: 6.7
使用IDEA创建Spring Boot项目,不会的同学请百度查看教程,这里提供一个教程地址
plugins {
id 'org.springframework.boot' version '2.3.7.RELEASE'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}
group = 'com.sj.task'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } // 阿里镜像源
mavenCentral()
}
dependencies {
// implementation 'org.springframework.boot:spring-boot-starter-websocket'
// implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-web' // Spring-web 重点在这个依赖中
// compile group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.4.2' // mybatis-plus基于mybatis只做增强不做改变,后面大家想学习的话可以讲!
compileOnly 'org.projectlombok:lombok'
// runtimeOnly 'mysql:mysql-connector-java' // mysql 驱动
annotationProcessor 'org.projectlombok:lombok' // 简化实体类
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
创建完Spring boot项目后将上面的代码替换掉build.gradle
接下来创建async包在包下创建TestAsyncService类

/**
* @description: 异步方法
* @author: 刘哈哈 wx:L065517
* @create: 2021-04-05 18:03
**/
@Async // 重点
@Slf4j // lombok为我们提供的日志注解有兴趣的小伙伴可以查一下
@Service
public class TestAsyncService {
/**
* 测试返回值为Void的异步方法
*
* @param param 参数
*/
public void testAsyncShow(final Long param) {
try {
Thread.sleep(2000); // 测试异步是否生效
log.info("参数:>>>>>{}", param); // 打印我们的param参数
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Async注解,是我们今天讲的重点。大家注意看我将@Async这个注解写在了类上面,这样的话在这个类中创建的函数讲道理说都是异步函数。
接下来我们创建Controller,首先创建controller包,然后在此包下创建AsyncController类:
/**
* @description: 测试异步方法的controller
* @author: 刘哈哈 wx:L065517
* @create: 2021-04-05 18:08
**/
@RestController
@RequiredArgsConstructor
public class AsyncController {
private final TestAsyncService testAsyncService;
@PostMapping("/{param}")
public ResponseEntity<Void> testShow(@PathVariable final Long param) {
testAsyncService.testAsyncShow(param);
return new ResponseEntity<>(HttpStatus.OK);
}
}
接下来看我们的启动类:
@SpringBootApplication
@EnableAsync
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程池大小
executor.setCorePoolSize(2);
// 最大线程池大小,不能小于核心线程池大小
executor.setMaxPoolSize(2);
executor.setQueueCapacity(500);
// 线程名称前缀
executor.setThreadNamePrefix("test-");
executor.initialize();
return executor;
}
}
接下来就大功告成了,启动项目。
随便为大家介绍一个IDEA自带的Http测试工具,相信用IDEA的同学肯定也用过,据说是代替Postman的神器。
请查看 IDEA 的Http工具小结:
我们在test包下创建http包在此包下创建test.http文件
### 测试异步方法
POST http://127.0.0.1:8080/220000
此时请求此方法你会发现方法是异步的。在你发出请求的同时Controller立马会给你响应。但是控制台还没有执行完异步函数中的逻辑。待线程休眠结束后你将会在控制台看到你请求的参数。
如果失败的同学请检查 是否在启动类上添加@EnableAsync
注解,此注解是开启Spring异步函数的开关。下个章节我们将详细的讲解@Async
和大家上面看到的启动类下面的taskExecutor()
函数的作用。




