本文介紹了Spring Boot 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));
}
這篇關于Spring Boot WebFlux:避免處理程序中的線程阻塞方法調用的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,