Вы можете проверить, если значение равно нулю с командой getIfPresent. , если значение равно null, вы можете отправить задачу, которая загружает значения асинхронно и продолжит свой поток.
пример:
Map<String, String> map = cache.getIfPresent(key);
if(map == null){
executorService.submit(new Callable<Map<String, String>>() {
@Override
public Map<String, String> call() throws Exception {
return cache.get(key);
}
});
}
else{
continue with the flow...
}
вы должны также использовать функцию refreshAfterWrite и реализовать метод перезагрузки, если вы хотите, чтобы обновить значения в кэше, пока вы все еще читаете старое значение. В этом случае кеш всегда будет обновляться, и основной поток, который считывает значения, не будет затронут.
пример:
cache = CacheBuilder.newBuilder()
.refreshAfterWrite(30, TimeUnit.SECONDS)
.build(
new CacheLoader<String, Map<String,String>>() {
public Map<String, String> load(String key) throws Exception {
map = hardWork(key)//get map from from DB -- expensive time commend
return map;
}
@Override
public ListenableFuture<Map<String, String>> reload(final String key, Map<String, String> oldValue) throws Exception {
// we need to load new values asynchronously, so that calls to read values from the cache don't block
ListenableFuture<Map<String, String>> listenableFuture = executorService.submit(new Callable<Map<String, String>>() {
@Override
public Map<String, String> call() throws Exception {
//Async reload event
return load(key);
}
});
return listenableFuture;
}
});
Я абсолютно уверен, что есть не способ достижения этой цели с текущим API. –