使用Spring Schedule清除缓存?

时间:2019-02-27 17:41:35

标签: java spring caching schedule

我有以下代码实现了简单的缓存。

 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启动应用程序。在clearCache运行约20-30次后,应用程序在执行restTemplate.exchange()时会抛出空指针。

如果我关闭/删除@Schedule;我没有收到任何错误restTemplate.exchange()可以正常工作。 restTemplate.exchange()不管@Schedule是否正在运行都将执行,并且不依赖于缓存。

如果我通过任何其他方法清除缓存(例如在读取缓存时检查时间并清除缓存),问题就不会解决。

我无法理解为什么使用@Scheduled时restTemplete失败。

0 个答案:

没有答案