Spring Webflux项目中Callable异步接口不生效问题咨询
问题根因分析
你引入的是spring-boot-starter-webflux依赖,属于响应式Web技术栈,不支持Spring MVC体系下的Callable异步返回处理逻辑:
- Spring MVC中框架会识别返回值为Callable类型,自动提交到线程池异步执行,完成后再将结果返回给前端
- WebFlux没有内置Callable返回值的处理器,会直接将Callable实例当做普通POJO做JSON序列化,由于Callable接口没有可供序列化的Getter方法,最终序列化结果就是空对象
{},且Callable的call()方法全程不会被调用,因此不会打印"async"日志。
解决方案
方案1:切换为Spring MVC技术栈
将pom.xml中的spring-boot-starter-webflux依赖替换为Spring Web依赖即可,原有业务代码无需修改:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
替换后重启项目,访问接口即可2秒后返回"hello",控制台也会打印对应日志。
方案2:适配WebFlux响应式写法
如果需要保留WebFlux技术栈,将返回值改为WebFlux支持的Mono类型即可:
@GetMapping("/callable") public Mono<String> callable() { log.info("callable"); return Mono.fromCallable(() -> { log.info("async"); Thread.sleep(2000); return "hello"; // 若需要业务逻辑异步执行,可指定响应式调度器 }).subscribeOn(Schedulers.boundedElastic()); }
内容的提问来源于stack exchange,提问作者Jingon Park
相关产品推荐
相关产品推荐

