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?
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) :-) –
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' –