如何使用Flux <map.entry <object,object =“” >>填充Map <object,object>,请使用reactRedisTemplate

时间:2018-07-01 08:42:27

标签: spring-webflux project-reactor

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始终为空。

2 个答案:

答案 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));