как заполнить карту <Object, Object> из Flux <Map.Entry <Object, Object >>, использовать реактивныйRedisTemplate - PullRequest
0 голосов
/ 01 июля 2018
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 голосов
/ 30 августа 2018

Пару дней назад я столкнулся с той же проблемой и в итоге использовал операцию collectMap. Мой вариант использования требовал, чтобы я извлек объект Processor из redis, который хранился в виде хэшей, поэтому для этого я обнаружил, что могу использовать следующее:

operations.opsForHash().entries("processor") // Returns a list of Entry<String,String>

Список записей должен быть собран как для карты, чтобы его можно было сопоставить с объектом, используя ObjectMapper. Следующая лямбда-цепочка извлекает все хэши из ключа «процессор», отображает их как карту с помощью collectMap, а затем с помощью функции .map() преобразует эту карту в объект процессора.

        Mono<Processor> processor = operations.opsForHash()
                                        .entries("processor")
                                        .collectMap(Entry::getKey,Entry::getValue)
                                        .map(entryMap -> new ObjectMapper().convertValue(entryMap, Processor.class));
0 голосов
/ 05 июля 2018

Вы уверены, что учли тот факт, что все асинхронно?

В этом случае метод subscribe не блокируется, пока карта не будет заполнена, но вместо этого немедленно возвращает управление. Если следующая строка кода проверяет содержимое карты, она может быть просто пустой, поскольку асинхронная операция еще не завершена.

Обратите внимание, что есть оператор collectMap, который генерирует Map реактивно (и вы даже можете предоставить Supplier<Map>, чтобы вызвать экземпляр LinkedHashMap). Здесь, если вы подписываетесь дважды подряд, ваша карта будет разделена между двумя подписками, которые будут пытаться заполнить ее (что может привести к проблемам с синхронизацией) ...

...