2014-03-24 4 views
5

Ich habe einen Guava Cache mit einer CacheLoader. Es gibt eine externe Bedingung, die ich in einem Thread track, und wenn dies passiert, möchte ich alle Einträge asynchron. Aus diesem Grund verwende ich invalidateAll() nicht, da die nächste get() warten müsste, bis die Last erfolgreich war.ungültig aktualisiert Eintrag in Guava CacheLoader

Stattdessen iterieren über die Schlüssel im Cache und refresh(k) alle von ihnen, wie ich eine refreshAll() -Methode nicht finden konnte. Hier ist der Code (aber nicht wirklich auf die Frage bezogen):

Set<ResourceLoaderKey> keys = resourceLoaderCache.asMap().keySet(); 
    for(ResourceLoaderKey k : keys) 
    { 
     resourceLoaderCache.refresh(k); 
    } 

Mein Problem ist jetzt, dass reload() im Cacheloader könnte erkennen, dass eine Ressource ist eigentlich nicht mehr zur Verfügung. Derzeit löst die reload() eine ResourceNotFound-Ausnahme aus, die für den get()-Fall funktioniert. Aber es funktioniert nicht für den Fall, da der alte Wert bedient wird, solange der reload() fehlschlägt.

Ich kann jetzt die nicht gefundene Ausnahme in den Lade/Neuladen-Methoden abfangen und den Eintrag irgendwie ungültig machen, aber ich frage mich, ob es eine offizielle Möglichkeit gibt (Null oder ein Null Zukunft wird als Warnung protokolliert und ignoriert)? Es wäre gut, in der Lage zu sein, den Schlüssel/Abwesend-Wert zu entfernen, anstatt ein Platzhalterobjekt herum zu halten.

+1

ähnliches Problem hier, meine aktuelle Lösung hässlich ist, wollen eine unterstützte Art und Weise war dies – Stephan

Antwort

0

Ein unterstützter Weg, dies zu tun, existiert zur Zeit nicht in Guava r17.

Haben Sie versucht, alle Schlüssel zu bekommen, dann alle ungültig machen und dann versuchen, alle Schlüssel zu bekommen, die Sie gespeichert hatten?

Das sollte sicherstellen, dass keine veralteten Werte im Cache verbleiben und alle vorhandenen Werte erneut cachen.

(Mein Problem war etwas anders, ich meine lösen musste meine Annahmen ändern)

+0

ich tun kann nicht, dass, wie Ich möchte nicht, dass die regulären Updates für unveränderte Schlüssel den Cache-Loader treffen. Vielleicht sollte ich darüber nachdenken, Invalidate innerhalb des Loaders aufzurufen ... – eckes

+1

@eckes würden Sie den Cache Loader sowieso nicht beim Aktualisieren aller Einträge treffen? Wie unterschiedlich sind die Implementierungen load() und reload()? – Stephan

+0

Ja, aber asynchron. – eckes