我知道 subscribeOn 用于在訂閱序列時切換執行線程,但我發現它不適用于 ServerRequest.bodyToMono/Flux就像是Flux.just(1,2,3) .doOnNext(integer -> log.info("test {}",integer)) .subscribeOn(Schedulers.elastic()) .subscribe();會使執行線程改變INFO 23313 --- [ elastic-2] c.a.p.m.f.service.router.TestService : test 1INFO 23313 --- [ elastic-2] c.a.p.m.f.service.router.TestService : test 2INFO 23313 --- [ elastic-2] c.a.p.m.f.service.router.TestService : test 3但令我困惑的是假設我有一個 Spring WebFlux 路由器:@Configurationpublic class TestRouter { @Bean public RouterFunction<ServerResponse> testRouterFunction(TestService testService) { return route().path("/test", builder -> builder.nest(accept(MediaType.ALL), route -> route.PUT("/", req -> { Mono<String> valueMono = req.bodyToMono(String.class); return ServerResponse.ok().body(testService.test(valueMono), String.class); }))).build(); }}和一個服務:@Service@Slf4jpublic class TestService { public Mono<String> test(Mono<String> mono) { return mono .doOnSubscribe(subscription -> log.info("on subscribe")) .subscribeOn(Schedulers.elastic()) .doOnNext(s -> log.info("received {}", s)) .subscribeOn(Schedulers.elastic()); }}基本邏輯是 http put 請求到 localhost:port/test 將接收以純文本形式發送到服務器的內容我嘗試讓 doOnNext 在其他線程而不是 Spring WebFlux 的 NIO 線程上運行,無論我放在哪里subscribeOn執行線程始終是 NIO 線程:INFO 23200 --- [ctor-http-nio-4] c.a.p.m.f.service.router.TestService : on subscribeINFO 23200 --- [ctor-http-nio-4] c.a.p.m.f.service.router.TestService : received test感謝@MichaelBerry @SimonBaslé,你們倆都幫了我很多忙,對你們的答案都投贊成票簡而言之,reactor-netty 將覆蓋 http 訂閱的 subscribeOn,使用 aflatMap()包含一個單獨的subscribeOn()on 不同的Mono/Flux或publishOn()可以完成我想要的工作
1 回答

白衣非少年
TA貢獻1155條經驗 獲得超0個贊
subscribeOn()
這不是您可以更改的內容 - 它只是調用之前調用的鏈中的最后一個調用subscribe()
,因此由 WebFlux 決定使用它想要的任何調度程序。在本例中,它看起來像是在 NIO 驅動的事件循環或類似循環中處理請求。
但是,您可以flatMap()
在鏈中包含一個調用,并為其指定subscribeOn()
一個不會被覆蓋的單獨調用。這可能是一個選項,具體取決于您的用例,因為您可以在調用中定義的發布者中完成大部分工作flatMap()
。
添加回答
舉報
0/150
提交
取消