2010-11-01 24 views
1

Beaucoup de personnes se réfèrent à ConcurrentMap en tant que cache.Puis-je utiliser ConcurrentMap avec mon propre cache?

Est-ce une bonne idée de le faire:

public List<Task> listTasks(final ProcessDefinition def, final boolean filterEnumerated) { 
    final String CACHENAME = def.getName() + "-v" + def.getVersion() + "-Tasks"; 
    ConcurrentMap<String, List<Task>> cache = (ConcurrentMap<String, List<Task>>) Contexts.getApplicationContext().get(CACHENAME); 
    if (Contexts.getApplicationContext().isSet(CACHENAME) && cache != null) { 
     return cache.get(CACHENAME); 
    } else { 

     ConcurrentMap<String, List<Task>> myTasks = new MapMaker() 
      .softValues() 
      .expiration(2L, TimeUnit.HOURS) 
      .makeComputingMap(
       new Function<String, List<Task>>() { 
       @Override 
       public List<Task> apply(String from) { 
        return getTasksFromDefinition(def, filterEnumerated); 
       } 
       }); 

     myTasks.put(CACHENAME, getTasksFromDefinition(def, filterEnumerated)); 

     Contexts.getApplicationContext().set(CACHENAME,myTasks); 
     Collection<List<Task>> tz = myTasks.values(); 
     //First element in the collection 
     return new ArrayList<Task>(tz.iterator().next()); 
    } 
} 

Ou est-il pas nécessaire d'utiliser la ApplicationContext (ce qui est le contexte d'application java-ee) en cache aussi la carte, et juste récupérer le valeur de la carte?
similaire à la réponse sur cette post

Je voudrais également savoir, le .expiration(2L, TimeUnit.HOURS). Est-ce vraiment 2 heures, ou le long prend-il des valeurs en millisecondes?

+0

S'il vous plaît modifier votre question pour indiquer que vous utilisez Google Collections, il va aider les gens à répondre (oui je sais que vous l'avez étiqueté comme tel) :-) –

+0

Je ne suis pas d'accord. Je crois que la question est toujours valide si vous n'utilisez pas MapMaker. C'est toujours un 'ConcurrentMap' –

Répondre

2

Personnellement, je pense que c'est bien de stocker un cache dans votre ApplicationContext car il est threadsafe. Mais soyez conscient de la taille du cache, surtout si vous êtes en cluster, etc.

Sur la question d'expiration, l'expiration est de 2 heures comme vous pouvez vous y attendre.