Spring Webflux выдает «block () / blockFirst () / blockLast () являются блокирующими, что не поддерживается в thread processor-http-nio-2» - PullRequest
0 голосов
/ 17 апреля 2020

У меня небольшая проблема с выполнением операции блокировки в Spring Webflux. Я получаю список документов статьи и из списка документов статьи, я хотел бы обновить другой объект.

Когда я выполняю нижеприведенное, иногда это работает, а иногда выдает "block () / blockFirst ( ) / blockLast () являются блокирующими, которые не поддерживаются в потоке реактор-http-nio-2 ". Подскажите, пожалуйста, как исправить. Я действительно не хочу блокировать это, но не знаю, как действовать. В stackoverflow есть похожие потоки, но не соответствующие моему требованию.

Было бы очень хорошо, если бы кто-то мог предложить способ обойти?

private OrderInfo setPrices(final OrderInfo orderInfo) {
    final List<ArticleDocument> articleDocuments = getArticleDocuments(orderInfo).block(); // Problematic line
    for (ArticleDocument article : articleDocuments) {
         //Update orderInfo based on one of the article price and few more condition.
  }
 return orderInfo;
}

private Mono<List<ArticleDocument>> getArticleDocuments(final OrderInfo orderInfo) {
    return this.articleRepository.findByArticleName(orderInfo.getArticleName()).collectList();
}

1 Ответ

1 голос
/ 17 апреля 2020

Это должно быть что-то вроде этого. Пожалуйста, обратите внимание, что я не проверял это на моей IDE. Чтобы что-то изменить, пожалуйста, прокомментируйте и разберитесь в этом вместе.

private Mono<OrderInfo> setPrices(final OrderInfo orderInfo) {
    getArticleDocuments(orderInfo)
        .map(articleDocuments -> {
            articleDocuments.forEach(article -> // UPDATE AS YOU NEED);
            return orderInfo;
        });

private Mono<List<ArticleDocument>> getArticleDocuments(final OrderInfo orderInfo) {
    return this.articleRepository.findByArticleName(orderInfo.getArticleName()).collectList();
}

Помните, что вы должны все связать. вот почему вы должны вернуть Mono<OrderInfo> вместо OrderInfo из setPrices метода. Если вы обнаружите, что мой предложенный код сложно адаптировать к вашей текущей структуре кодирования, вы можете показать мне полный код. Давайте выясним, можем ли мы построить хорошую цепочку или нет.

Кстати, вы использовали getArticleDocuments(orderInfo).block();. Видеть? Вы использовали .block()? Не делай этого в цепочке. никогда не блокируйте ничего в запросе к процессу цепочки ответов. вы вернете моно или поток из контроллера, и все будет обработано webflux

...