2016-12-16 3 views
0

Я новичок в Guava, и я хочу вернуть список пользователей по существу a String. Я использую один сторонний API для извлечения списка. Я хочу кэшировать этот список и возвращать весь этот список, если пользователь запрашивает.Использование Google Guava для получения списка

Я посмотрел несколько примеров в Интернете, и они используют LoadingCache<k, v> and CacheLoader<k,v>. У меня нет второго аргумента, и имена пользователей уникальны. Наша заявка не будет поддерживать индивидуальные запросы пользователя

Есть ли какой-либо вкус/я могу twik LoadingCache, который позволит мне это сделать? Что-то вроде

LoadingCache<String> 
.. some code .. 
CacheLoader<String> { 
/*populate comma separated list_of_users if not in cache*/ 
return list_of_users 
} 
+0

У вас есть два близких голосов «неясно, что вы просите», отчасти потому, что ваш пример кода не даже близко к действительной Java, а отчасти потому, что вы не имеете объяснил, что вам нужно делать в кеше. Попробуйте хотя бы предоставить пример того, как вы хотите взаимодействовать с классом, который вы пишете, и ожидаемыми результатами. (Если это выглядит как фрагменты теста jUnit, вы на правильном пути) – slim

ответ

0

Как вы не сомневаетесь, видели, шаблон для LoadingCache является:

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() 
    .maximumSize(1000) 
    .expireAfterWrite(10, TimeUnit.MINUTES) 
    // ... other configuration builder methods ... 
    .build(
     new CacheLoader<Key, Graph>() { 
     public Graph load(Key key) throws AnyException { 
      return createExpensiveGraph(key); 
     } 
     }); 

Если служба не принимает ключ, то вы можете просто игнорировать его, или использовать константа.

LoadingCache<String, String> userListSource = CacheBuilder.newBuilder() 
    .maximumSize(1) 
    .expireAfterWrite(10, TimeUnit.MINUTES) 
    // ... other configuration builder methods ... 
    .build(
     new CacheLoader<String, String>() { 
     public Graph load(Key key) { 
      return callToYourThirdPartyLibrary(); 
     } 
     }); 

Вы можете скрыть тот факт, что игнорировали ключ существует вообще, обернув его в другой метод:

public String userList() { 
     return userListSource.get("key is irrelevant"); 
    } 

Он не чувствует, как если бы вам нужно все силы кэша Гуава в вашем случае использования. Он истекает через тайм-аут и поддерживает удаление прослушивателей. Вам это действительно нужно? Вы могли бы написать что-то очень простое, а не как:

public class UserListSource { 
    private String userList = null; 
    private long lastFetched; 
    private static long MAX_AGE = 1000 * 60 * 5; // 5 mins 

    public String get() { 
     if(userList == null || currentTimeMillis() > lastFetched + MAX_AGE) { 
      userList = fetchUserListUsingThirdPartyApi(); 
      fetched = currentTimeMillis(); 
     } 
     return userList; 
    } 
} 
+1

В последнем примере вы также можете использовать что-то вроде «Поставщики # memoizeWithExpiration' https://google.github.io/guava/releases/19.0 /api/docs/com/google/common/base/Suppliers.html#memoizeWithExpiration(com.google.common.base.Supplier, long, java.util.concurrent.TimeUnit) – forrert

Смежные вопросы