Нужна помощь, чтобы понять выполнение плоской карты для упомянутого примера кода - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь вызвать API отдыха и накапливать результат, используя Flux & Webclient. Я хочу понять выполнение оператора flatMap для кода ниже.

  • список - содержит 50000 элементов.
  • restClient - это веб-клиент. WebClient.builder().baseUrl(url).filter(ExchangeFilterFunctions.basicAuthentication(userId, pwd)).build()
  • restClient.getResult - вернуть моно. client.get().uri(uri).retrieve().bodyToMono(returnType)

Первый журнал печатает имя потока в качестве основного наверняка нет. элемента тогда он начал печатать реактор-http-nio- (нить-нет). Второй журнал печатает имя потока как реактор-http-nio- (поток-нет). Просьба объяснить, как происходит выполнение потока и переключение здесь.

        Flux.fromIterable(list)
            .log()
            .map(e -> e.trim())
            .flatMap(e -> restClient.getResult(client, e, String.class))//e is being used to create uri
            .log()
            .subscribe(e -> result.add(e));

1 Ответ

0 голосов
/ 05 апреля 2019

flatMap имеет параметр concurrency, который по умолчанию равен 256. Как только он подписан, он запрашивает 256 элементов из источника (fromIterable) и сопоставляет их с внутренними издателями (вызовы WebClient).).

Это делается в потоке подписки, который здесь является потоком main.

Как только он имеет 256 элементов "в полете", flatMap будет пополняться по мере необходимости всякий раз, когдаВнутренняя завершается, запрашивая еще один элемент источника из итерируемого, затем отображая его на новый WebClient внутренний.

Это делается в только что завершенном потоке внутреннего, который здесь - netty http-nio-x нить.

...