2013-08-23 1 views
1
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() 
     .maximumSize(1000) 
     .build(
      new CacheLoader<Key, Graph>() { 
      public Graph load(Key key) throws AnyException { 
       return createExpensiveGraph(key); 
      } 
      }); 

Метод createExpensiveGraph может потребовать много времени, чтобы вернуть значение. Я хочу установить лимит времени в методе load, так что если метод createExpensiveGraph не вернул значение в течение ограниченного времени, то будет выброшен TimeLimitedException. Как установить ограничение по времени в методе load?Как использовать функцию загрузки кеша guava с предельным временем?

ответ

5

Вы можете использовать Callable и ExecutorService реализовать поведение таймаута:

final ExecutorService executor = MoreExecutors.sameThreadExecutor(); 

final LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() 
     .maximumSize(1000) 
     .build(
      new CacheLoader<Key, Graph>() { 
       public Graph load(final Key key) throws Exception { 
        return executor.submit(new Callable<Graph>() { 
         @Override 
         public Graph call() { 
          return createExpensiveGraph(key); 
         } 
        }).get(MY_TIME_LIMIT_SECONDS, TimeUnit.SECONDS); 
       } 
      }); 

И на сайте в get вызова:

final Graph graph; 
try { 
    graph = graphs.get(myKey); 
} 
catch (ExecutionException executionException) { 
    final Throwable cause = Throwables.getRootCause(executionException); 
    if (cause instanceof TimeoutException) { 
     // timeout specific logic 
    } 
    // other error handling 
} 

// use graph 
0

пример Пола Bellora как написано не будет работать из-за MoreExecutors.sameThreadExecutor() ,

Из javadocs для MoreExecutors.sameThreadExecutor():

Задач выполняются до завершения перед Будущим возвращаются к абоненту (если исполнитель не был отключение).

Поэтому get на будущее не будет вызываться только после завершения выполнения createExpensiveGraph. Используйте Executors.newSingleThreadExecutor() или аналогичный Исполнитель для поддержки тайм-аутов.