我在 Spring Webflux 中执行阻塞操作时遇到一个小问题。我检索文章文档列表,并从文章文档列表中,我想更新另一个对象。
当我执行下面的代码时,有时它会起作用,有时会抛出“block()/blockFirst()/blockLast() 正在阻塞,这在线程reactor-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();
}
它一定是这样的。请注意,我尚未在我的 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
from setPrices
方法。如果您发现我建议的代码很难适应您当前的编码结构,您可以向我展示完整的代码。让我们看看我们能否建立一个好的链条。
顺便说一句,你正在使用getArticleDocuments(orderInfo).block();
。看?你正在使用.block()
?不要在连锁店里这样做。永远不要阻止响应链进程的请求中的任何内容。您将从控制器返回单声道或通量,一切都将由 webflux 处理
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)