Spring WebFlux не смог переключить блокирующую операцию на другой планировщик в результате - PullRequest
0 голосов
/ 16 мая 2019

Я занимаюсь разработкой веб-сервера на основе аннотаций на основе 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 блокируется, пока не будет выполнена работа с эластичной нитью). По моему мнению, если он поддерживает неблокирующую модель потоков ввода-вывода, когда вы передали контекст другим планировщикам, остальная работа обрабатывается там.

Возможно ли переключить планировщик обработчика ответов? Если это невозможно, я бы понял, почему они так проектируют.

1 Ответ

0 голосов
/ 02 июля 2019

Я сделал ошибку в моем тестовом коде.Я использовал RestTemplate, чтобы сделать запрос.Я пропустил, что у объекта Factory для экземпляра RestTemplate есть ограничение максимального количества запросов в параллельном режиме.(По умолчанию максимальный запрос равен 5.).После фиксированного максимального количества запросов он работал хорошо.

...