【发布时间】:2022-09-24 04:35:25
【问题描述】:
我有一个 <Integer, QueryObj> 的哈希图,我需要对其进行迭代并调用外部服务。我的外部服务的方法签名如下:
private Mono<List<ReturnedObj>> fetchList(QueryObj query)
我已经能够验证它是否正常工作并返回我需要的列表。但是,我不确定我的下一步应该是什么,以及我在父方法中的响应类型应该是什么,以便保持反应性实践。基本上,我想将Map<Integer, Query> 转换为Map<Integer, Mono<List<ReturnedObj>>。我想知道Map<Integer, Mono<List<ReturnedObj>> 是否可能?需要Mono<Map<K<V>>吗?
这是当前代码 sn-p - 它不会抛出错误,而是返回一个空结果。我认为命令式和反应式编程的混合不会等待fetchList() 的结果来填充响应。
Map<Integer, QueryObj> queryMap = getQueries(); // setup
return queryMap.entrySet()
.stream()
.collect(Collectors.toMap(
e -> e.getKey(), e -> {
try {
return fetchList(e.getValue());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}));
}
非常感谢任何帮助!我对此很陌生。
-
I am wondering if Map<Integer, Mono<List<ReturnedObj>>> is even possible?。当然,为什么不呢?empty是什么意思。在您订阅每个Monos之前,不会填充任何结果。您确定不想获取Monos的结果并返回Map<Integer, List<ReturnedObj>>吗?查看Mono::zip。 -
@K.Nicholas 是对的。根据您的需要,您可能希望反转逻辑,以返回
Flux<Tuple2<Integer, List<ReturnedObj>>。这应该使所有管道“冷”,这意味着消耗通量的人将触发查询。相反,如果你真的想要Map<Integer, Mono<List<ReturnedObj>>,因为你想急切地处理查询,然后缓存它们,你可能想看看Mono上的cache()和connect()运算符。如果您仍在苦苦挣扎,请为您的问题添加更多上下文,然后在评论中回复我。然后我会尝试发布详细的答案。
标签: java spring project-reactor