Я занимаюсь разработкой веб-сервера на основе аннотаций на основе Spring WebFlux (Reactor Netty).
Этот сервер вызывает операции блокировки (JDBC).
Я пытался переключить каждую блокирующую операцию на «Эластичный планировщик», который предоставляет Reactor.
@RestController
@RequiredArgsConstructor
@RequestMapping("/member")
public class MemberApiRestController {
private final MemberService memberService;
@GetMapping("/all")
public Mono<List<String>> findAllMembers() {
return Mono
.fromCallable(()->memberService.findAll())
.map(member::toString)
.subscribeOn(Schedulers.elastic())
.publishOn(Schedulers.elastic())
}
}
public class MemberService {
public List<Member> findAll() {
log.debug("Blocking Operation...")
//Blocking - Operation.
}
}
log is like ...
2019-05-16 10:26:58,227 |-LOCAL [reactor-http-nio-7] TRACE o.s.web.server.adapter.HttpWebHandlerAdapter: 87 - [165a3273] HTTP GET "/member/all", headers={masked}
2019-05-16 10:26:58,249 |-LOCAL [elastic-20] DEBUG MemberService: 36 - Blocking Operation...
2019-05-16 10:27:00,277 |-LOCAL [reactor-http-nio-7] TRACE o.s.web.server.adapter.HttpWebHandlerAdapter: 87 - [165a3273] Completed 200 OK, headers={masked}
Поскольку метод memberService.findAll () является блокирующей операцией, я переключился на Schedulers.elastic ().
Этот метод вызывается в планировщике. Тем не менее, последний процесс в ответ на нить реактора-http-nio.
Это похоже на модель блокировки (нить реактора-http-nio блокируется, пока не будет выполнена работа с эластичной нитью). По моему мнению, если он поддерживает неблокирующую модель потоков ввода-вывода, когда вы передали контекст другим планировщикам, остальная работа обрабатывается там.
Возможно ли переключить планировщик обработчика ответов?
Если это невозможно, я бы понял, почему они так проектируют.