Я реализую CacheLoader
для Guava's LoadingCache
. CacheLoader.reload()
принимает ключ и старое значение и возвращает ListenableFuture
. Поскольку реализация по умолчанию вызывает load()
синхронно, я хочу переопределить reload()
для асинхронной загрузки значения.
Вот как я это реализовал -
@Override
public ListenableFuture<Object> reload(RedisKey<?> key, Object oldValue) throws Exception {
CompletionStage<byte[]> f = redisClusterClient.asyncGet(key.getActualKey()).asCompletionStage();
ListenableFutureTask<Object> task = ListenableFutureTask.create(() -> f.toCompletableFuture().get());
f.thenRun(task::run);
return task;
}
Мой RedisClient имеет asyncGet()
, поэтому я хотел использовать ее вместо поддержки собственной службы executor и предоставления ей ListenableFutureTask
, как показано в CachesExplained
Выглядит ли подход корректным и есть ли лучше?