2012-09-13 9 views
5

Kann jemand bestätigen, wenn TTL-Einstellungen z. timeToLiveSeconds kann mit dem Grails Cache Plugin mit der ehcache extension eingestellt werden?Grails Cache-ehcache-Plugin und TTL-Werte

Die Dokumentation für das Basis-Plugin besagt explizit, dass TTL nicht unterstützt wird, aber die Erweiterung ehcache erwähnt diese Werte. Bis jetzt hatte ich keinen Erfolg, TTL-Werte für meinen Cache zu setzen:

grails.cache.config = { 
    cache { 
     name 'messages' 
     maxElementsInMemory 1000 
     eternal false 
     timeToLiveSeconds 120 
     overflowToDisk false 
     memoryStoreEvictionPolicy 'LRU' 
    } 
} 

@Cacheable('messages') 
def getMessages() 

Die Nachrichten bleiben jedoch unbegrenzt zwischengespeichert. Ich kann den Cache manuell mit der Annotation @CacheEvict leeren, aber ich hatte gehofft, dass TTL bei der Verwendung der Erweiterung ehcache unterstützt wird.

Dank

+0

diese Frage vor langer Zeit gefragt wurde, aber https sehen://jira.grils.org/browse/GPCACHEEHCACHE-6 –

+0

@Ken, dass der Link jetzt unterbrochen ist – GreenGiant

Antwort

6

Ja, das Plugin cache-ehcache unterstützt definitiv TTL und alle Cache-Konfigurationseigenschaften, die nativ von EhCache unterstützt werden. Wie in der Dokumentation erwähnt, implementiert das Base-Cache-Plugin einen einfachen In-Memory-Cache, der TTL nicht unterstützt, aber die Cache-DSL wird alle unbekannten Konfigurationseinstellungen an den zugrunde liegenden Cache-Provider weitergeben.

Sie können, indem Sie das folgende Config.groovy oder CacheConfig.groovy die ehcache Einstellungen konfigurieren:

grails.cache.config = { 
    cache { 
     name 'mycache' 
    } 

    //this is not a cache, it's a set of default configs to apply to other caches 
    defaults { 
     eternal false 
     overflowToDisk true 
     maxElementsInMemory 10000 
     maxElementsOnDisk 10000000 
     timeToLiveSeconds 300 
     timeToIdleSeconds 0 
    } 
} 

Sie die Cache-Einstellungen zur Laufzeit überprüfen können, wie folgt:

grailsCacheManager.cacheNames.each { 
    def config = grailsCacheManager.getCache(it).nativeCache.cacheConfiguration 
    println "timeToLiveSeconds: ${config.timeToLiveSeconds}" 
    println "timeToIdleSeconds: ${config.timeToIdleSeconds}" 
} 

die EhCache javadoc for CacheConfiguration für die anderen sehen Cache-Eigenschaften. Sie können auch eine detaillierte Debug-Protokollierung des Zwischenspeicherns aktivieren, indem Sie grails.plugin.cache und net.sf.ehcache protokollieren.

Beachten Sie, dass die Grails-Caching-Plugins ihren eigenen Cache-Manager implementieren, der sich vom nativen EhCache-Cache-Manager unterscheidet. Wenn Sie EhCache direkt konfiguriert haben (mit ehcache.xml oder anderen Mitteln), werden diese Caches getrennt von den Caches ausgeführt, die vom Grails-Plugin verwaltet werden.

Hinweis: In älteren Versionen des Cache-EhCache-Plugins gab es tatsächlich einen Fehler, bei dem die TTL-Einstellung nicht korrekt eingestellt wurde und Objekte in einem Jahr abliefen; dies wurde in Grails-Cache-Ehcache 1.1 behoben.

0

Die TTL-Eigenschaft wird mit der ehcache Kern-Plugin unterstützt. Wie installierst du das Plugin? Für mein Projekt habe ich nur:

compile ":cache-ehcache:1.0.0" 

in BuildConfig.groovy in den Plugins Schließung. Da dieses Plugin eine Abhängigkeit vom Core-Grails-Cache-Plugin hat, müssen Sie es nicht deklarieren.

0

Ich konnte dieses Problem beheben, indem ich die Konfiguration beim Start mit dem Skript grails-app/conf/BootStrap.groovy überschrieb.

Zum Beispiel ist dies das Skript die Standardzeit außer Kraft zu setzen, um 60 Sekunden eines Cache zu leben namens „myCache“:

class BootStrap { 

    def grailsCacheManager 

    def init = { servletContext -> 
     grailsCacheManager.getCache("mycache").nativeCache 
         .cacheConfiguration.timeToLiveSeconds = 60 
    } 
    def destroy = { 
    } 
}