Spring Boot WebFlux:避免处理程序中的线程阻塞方法调用

2022-04-06 00:00:00 java spring-webflux

我才刚刚开始学习WebFlux和整个反应式范例,我被困在这一点上:

@Component
public class AbcHandler {

    private ObjectMapper objectMapper = new ObjectMapper();

    public Mono<ServerResponse> returnValue() throws IOException {

        Abc abc = objectMapper.readValue(new ClassPathResource("data/abc.json").getURL(), Abc.class);

        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(abc));
    }
}

IntelliJ警告我readValue()toURL()是线程阻塞方法调用。

我可以忽略这一点吗?否则我应该如何返回从文件系统读取并映射到域类的JSON结构?

我觉得这应该以一种异步的方式完成,或者至少应该更多地"反应"。


解决方案

您应该将其包装在FromCallable中,并确保它在其自己的线程上运行。

Blocking calls in reactor

@Autowire
private ObjectMapper objectMapper;

public Mono<ServerResponse> fooBar() throws IOException {
    return Mono.fromCallable(() -> objectMapper.readValue(new ClassPathResource("data/Foo.json")
            .getURL(), Foo.class))
            .subscribeOn(Schedulers.boundedElastic())
            .flatMap(foo -> ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
            .bodyValue(foo));

}

相关文章