У меня есть следующий код, который реализует простой кеш.
public Observable<String> getSomethingEveryoneWants(String key) {
final Map<String, String>localCacheReference = GlobalCache.cache;
return Observable.create(subscriber -> {
if(!localCacheReference.containsKey(key)) {
localCacheReference.put(key, doAHeavyCallToGetValueFor(key));
}
subscriber.onNext(localCacheReference.get(key));
subscriber.onCompleted();
}).subscribeOn(Schedulers.io()).map(String.class::cast);
}
Мне также нужна возможность очистить кеш в зависимости от какой-то конфигурации: поэтому я что-то сделал
//By default run every mid night. This should be defined in propFile
@Scheduled(cron = "${corn.cronString:0 0 0 * * *}")
public void clearCache() {
GlobalCache.cache = new ConcurrentHashMap<>();
}
Видите ли вы что-то не так с этим подходом?Мое приложение запускается нормально и некоторое время работает как положено.Но начинает сбой случайным образом после запуска clearCache около 20-30 раз.Есть ли какие-либо побочные эффекты, которые мне нужно знать?
Обновление: загрузочное приложение Spring.Приложение выдает нулевой указатель При выполнении restTemplate.exchange () после clearCache запускается примерно 20-30 раз.
Если я выключаю / удаляю @Schedule;Я не получаю никаких ошибок restTemplate.exchange () работает как положено.restTemplate.exchange () выполняется независимо от того, работает @Schedule или нет и не зависит от кеша.
Проблема не возникает, если я очищаю кеш любым другим способом, например, проверяю время при чтении кешаи очистка кэша.
Я не могу понять, почему restTemplete терпит неудачу при использовании @Scheduled.