0

Я пытаюсь понять, что произойдет, если я кэширую результат метода, возвращающего холодный наблюдаемый? Поток еще не материализован, так что собственно кеш содержит? Я попытался выяснить использование Hazelcast и Spring Boot, но не смог получить работу кеша.Как кэшировать реактивный издатель вроде Observable?

Редактировать: Когда я говорю, что кеш не работает, я говорю на основе того, что я вижу из Центра управления Hazelcast. В зависимости от конфигурации кеша (я пробовал много вещей), либо кеш отображается, но нет записей, либо кеш не отображается вообще.

Пример:

@javax.cache.annotation.CacheResult 
Observable<Integer> random() { 
    // Do I get a new number every time? 
    return Observable.just(new Random().nextInt()); 
} 
+0

Что означает «не может заставить работать кеш»? – Enigmativity

+0

@ Энигматичность См. Редактирование. –

ответ

1

Из ого-Java вик (источник here):

Холодных Наблюдаемые излучает определенную последовательность элементов, но может начать излучающие эту последовательность, когда ее наблюдатель находит это должно быть удобно, и любой ценой, которую желает Наблюдатель, не нарушая целостности последовательности . Например, если вы конвертируете статический Iterable в наблюдаемый, то Observable будет издать одну и ту же последовательность элементов независимо от того, когда она будет позже подписана или как часто эти элементы наблюдаются. Примеры элементов, испускаемых холодным Observable, могут включать в себя результаты запроса базы данных, файл поиск или веб-запрос.

С холодным Observable, как и ваш пример, запрос выполняется в течение подписки, для каждого абонента. Даже без кеша, если вы дважды подписываетесь на тот же номер Observable, запрос будет происходить дважды. Observable не привязан к определенному потоку. Observable - это просто контракт, описывающий доступ к данным.

Кэширование результата метода, возвращающего Observable, я думаю, что это похоже на сохранение результата в локальном свойстве; вы просто не сможете снова воссоздать объект Observable. Но просто «геттер», а не данные.

rx-java предоставляет некоторые инструменты для достижения кеширования самостоятельно. Вы можете взглянуть на Subject или ConnectableObservable.

+0

Итак, суть вашего ответа в том, что 'Observable' нельзя кэшировать с использованием традиционных методов. Правильно ли я понял? –

+0

Я не знаю всех этих методов, но большинство из них кэширует Observable, но не поток, проходящий через него, да. –

+0

@AbhijitSarkar - Наблюдаемый может быть кэширован нормально, но наблюдаемый не совпадает с значениями, полученными наблюдаемым. Это происходит только тогда, когда у вас есть наблюдатель и подписка. – Enigmativity