我刚刚开始使用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()
and toURL()
是线程阻塞方法调用。
我可以忽略这一点,或者我应该如何返回我从文件系统读取并映射到域类的 JSON 结构?
我觉得这应该以异步方式或至少更加“反应性”地完成。
您应该将其包装在 fromCallable 中,并确保它在自己的线程上运行。
阻止反应堆中的调用 https://projectreactor.io/docs/core/release/reference/#faq.wrap-blocking
@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));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)