Flux<Map.Entry<Object, Object>> entries = reactiveRedisTemplate .opsForHash().entries(key);
Map<Object, Object> stringObjectMap = new LinkedHashMap<>();
entries.subscribe(e -> stringObjectMap.put(e.getKey(), e.getValue()));
我想从条目中填充stringObjectMap
,但是stringObjectMap
始终为空。
答案 0 :(得分:0)
您确定所有事情都是异步的吗?
在这种情况下,subscribe
方法在映射被填满之前不会阻塞,而是立即返回控制权。如果您的下一行代码检查了地图的内容,则该内容可能只是空的,因为异步操作尚未完成。
请注意,有一个collectMap
运算符以反应方式生成一个Map
(您甚至可以提供一个Supplier<Map>
来强制一个LinkedHashMap
实例)。在这里,如果您连续两次订阅,则地图将在两个订阅之间共享,这两个订阅都将尝试填充地图(这可能会导致同步问题)...
答案 1 :(得分:0)
几天前,我遇到了同样的问题,最终使用了collectMap
操作。我的用例要求我从redis中提取一个Processor对象,该对象存储为哈希,因此,我发现可以使用以下代码:
operations.opsForHash().entries("processor") // Returns a list of Entry<String,String>
必须针对地图收集条目列表,以便可以使用ObjectMapper
将其映射到对象。以下lambda链从“处理器”键中提取所有哈希,使用collectMap
将它们映射为映射,然后使用.map()
函数将此映射转换为Processor对象。
Mono<Processor> processor = operations.opsForHash()
.entries("processor")
.collectMap(Entry::getKey,Entry::getValue)
.map(entryMap -> new ObjectMapper().convertValue(entryMap, Processor.class));