暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Boot实现异步函数

产教Code 2021-04-05
472

作者:刘哈哈
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.classargs);
    }

    @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()
函数的作用。


文章转载自产教Code,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论