Asynchrone Cache-Aktualisierung mit Spring-Cache-Abstraktion

Wie kann ich mithilfe der Caching-Abstraktion von Spring einen Eintrag von einem Cache asynchron aktualisieren lassen, während der alte Eintrag weiterhin zurückgegeben wird?

Ich versuche, mithilfe der Spring-Caching-Abstraktion ein Caching-System zu erstellen, bei dem Cache-Einträge nach einem relativ kurzen "weichen" Timeout für die Aktualisierung freigegeben werden. Wenn sie dann abgefragt werden, wird der zwischengespeicherte Wert zurückgegeben und eine asynchrone Aktualisierungsoperation gestartet, um den Eintrag zu aktualisieren. Ich würde auc

it dem Cache Builder von @ Guava kann ich festlegen, dass Einträge im Cache nach einer bestimmten Zeit aktualisiert werden sollen. Die reload () -Methode des Cache Loader kann dann mit einer asynchronen Implementierung überschrieben werden, sodass der veraltete zwischengespeicherte Wert zurückgegeben werden kann, bis der neue abgerufen wird. Das Spring-Caching scheint jedoch nicht den CacheLoader eines zugrunde liegenden Guava-Caches zu verwende

Ist es möglich, diese Art der asynchronen Cache-Aktualisierung mithilfe der Spring-Caching-Abstraktion durchzuführen?

Edit zur Verdeutlichung: Mit Guavas CacheBuilder kann ich refreshAfterWrite () verwenden, um das gewünschte Verhalten zu erhalten. z.B. von Guava Caches erklärt:

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
   .maximumSize(1000)
   .refreshAfterWrite(1, TimeUnit.MINUTES)
   .build(
       new CacheLoader<Key, Graph>() {
         public Graph load(Key key) { // no checked exception
           return getGraphFromDatabase(key);
         }

         public ListenableFuture<Graph> reload(final Key key, Graph prevGraph) {
           if (neverNeedsRefresh(key)) {
             return Futures.immediateFuture(prevGraph);
           } else {
             // asynchronous!
             ListenableFutureTask<Graph> task = ListenableFutureTask.create(new Callable<Graph>() {
               public Graph call() {
                 return getGraphFromDatabase(key);
               }
             });
             executor.execute(task);
             return task;
           }
         }
       });

Ich kann jedoch keine Möglichkeit finden, das Verhalten von refreshAfterWrite () mithilfe der @Cacheable-Abstraktion von Spring zu ermitteln.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage