springboot中@Async的简单用法

springboot中@Async的简单用法

文章目录

开启配置

在配置文件或者入口文件上新增注解: @EnableAsync即可

@Async的使用

对应需要异步调用的方法上添加@Async注解即可

无返回值调用

controller代码

java 复制代码
    @RequestMapping("test1")
    public String test1() {
        System.out.println("controller1调用开始");
        testService.test1();
        System.out.println("controller1调用结束");
        return "success test1";
    }

service代码

java 复制代码
    @Async
    public void test1() {
        System.out.println("service1调用开始");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("service1调用结束");
    }

运行结果

复制代码
controller1调用开始
controller1调用结束
service1调用开始
service1调用结束

可以看到service的已异步调用

带返回值的调用

如果需要执行耗时操作, 又想在结束后执行如发送通知或者保存数据库等方法时, 我们就可以使用带返回值的调用方法

如果需要返回, 则类型需为Future的子类, 最好是返回 CompletableFuture, 里面提供了更多的扩展

controller代码

java 复制代码
    @RequestMapping("test2")
    public String test2() {
        System.out.println("controller2调用开始");
        CompletableFuture<String> stringCompletableFuture = testService.test2();
        stringCompletableFuture.whenComplete((s, throwable) -> {
           if (throwable != null) {
               System.out.println("出现异常: " + throwable.getLocalizedMessage());
               return;
           }
           if (StringUtils.hasText(s)) {
               // todo 此处可以进行发通知/写入数据库等操作
               System.out.println("service2返回值: " + s);
           }
        });
        System.out.println("controller2调用结束");
        return "success test2";
    }

service代码

java 复制代码
    @Async
    public CompletableFuture<String> test2() {
        System.out.println("service2调用开始");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("service2调用结束");
        return CompletableFuture.completedFuture("成功执行");
    }

运行结果(未生效请重启应用)

复制代码
controller2调用开始
service2调用开始
controller2调用结束
service2调用结束
service2返回值: 成功执行

可以看到service的在异步调用结束后, 执行了 whenComplete里面的内容

如果需要在controlle里面同步执行service, 则调用CompletableFuture.get方法即可

controller代码

java 复制代码
    // service代码不变
    @RequestMapping("test3")
    public String test3() throws ExecutionException, InterruptedException {
        System.out.println("controller3调用开始");
        CompletableFuture<String> stringCompletableFuture = testService.test2();
        String s = stringCompletableFuture.get();
        System.out.println("controller3调用结束, 返回值: " + s);
        return "success test3";
    }

运行结果

复制代码
controller3调用开始
service2调用开始
service2调用结束
controller3调用结束, 返回值: 成功执行

可以看到controller已阻塞等待执行结果, 源码注释也可看出

更多功能请参考CompletableFuture接口, 比如同时调用n个@Async接口并任一执行成功后返回(anyOf)/全部执行成功后返回(allOf)等

相关推荐
先睡几秒前
RabbitMQ
java
笑衬人心。2 分钟前
Java 17 新特性笔记
java·开发语言·笔记
麦兜*1 小时前
Spring Boot 企业级动态权限全栈深度解决方案,设计思路,代码分析
java·spring boot·后端·spring·spring cloud·性能优化·springcloud
ruan1145142 小时前
MySQL4种隔离级别
java·开发语言·mysql
程序员爱钓鱼3 小时前
Go语言实战案例-读取用户输入并打印
后端·google·go
Hellyc6 小时前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
lifallen6 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
hdsoft_huge6 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
Livingbody7 小时前
基于【ERNIE-4.5-VL-28B-A3B】模型的图片内容分析系统
后端