Является ли это правильным и лучшим способом реализации reload () для LoadingCache в Guava - PullRequest
0 голосов
/ 19 марта 2020

Я реализую 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

Выглядит ли подход корректным и есть ли лучше?

...