当前位置: 首页 > 知识库问答 >
问题:

Spring Webflux抛出“block()/blockFirst()/blockLast()正在阻塞,这在线程反应器-http-nio-2中是不支持的”

漆雕洋
2023-03-14

我在Spring Webflow中执行阻塞操作时遇到了一个小问题。我检索文章文档列表,并从文章文档列表中,我想更新另一个对象。

当我执行以下操作时,有时它会工作,有时会抛出“block()/block First()/block Last()被阻塞,这在线程reactor-超文本传输协议-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个答案

杨雪松
2023-03-14

它必须是这样的。请注意,我没有在我的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();
}

请记住,您必须将所有内容置于链接之下。这就是为什么你必须返回单声道

顺便说一句,你正在使用getArticleDocuments(orderInfo). block();。看到了吗?你在使用. block()?不要在链中这样做。永远不要阻止响应链进程中的任何请求。您将从控制器返回mono或通量,一切都将由webflow处理

 类似资料: