Ho una semplice applicazione Grails che deve effettuare una chiamata periodica a un servizio Web esterno più volte durante la sessione di un utente (mentre si usa l'interfaccia).La migliore strategia per memorizzare una costosa chiamata al servizio web in Grails
Vorrei memorizzare nella cache questa risposta al servizio web, ma i risultati del servizio cambiano ogni pochi giorni, quindi mi piacerebbe memorizzarlo nella cache per un breve periodo (aggiornamenti giornalieri).
Il plug-in della cache di Grails non sembra supportare le implementazioni "time to live", quindi ho esplorato alcune possibili soluzioni. Mi piacerebbe sapere quale plugin o soluzione programmatica sarebbe meglio risolvere questo problema.
Esempio:
BuildConfig.groovy
plugins{
compile ':cache:1.0.0'
}
MyController.groovy
def getItems(){
def items = MyService.getItems()
[items: items]
}
MyService.groovy
@Cacheable("itemsCache")
class MyService {
def getItems() {
def results
//expensive external web service call
return results
}
}
UPDATE
C'erano molte buone opzioni. Ho deciso di seguire l'approccio plug-in suggerito da Burt. Ho incluso una risposta esemplificativa con piccole modifiche al precedente esempio di codice per aiutare gli altri a voler fare qualcosa di simile. Questa configurazione espira la cache dopo 24 ore.
BuildConfig.groovy
plugins{
compile ':cache:1.1.7'
compile ':cache-ehcache:1.0.1'
}
Config.groovy
grails.cache.config = {
defaultCache {
maxElementsInMemory 10000
eternal false
timeToIdleSeconds 86400
timeToLiveSeconds 86400
overflowToDisk false
maxElementsOnDisk 0
diskPersistent false
diskExpiryThreadIntervalSeconds 120
memoryStoreEvictionPolicy 'LRU'
}
}
Utilizzando il plug-in di cache più recente, non è possibile espirarlo: "Poiché non esiste alcun modo per configurare" time to live "con questo plug-in, tutti gli elementi memorizzati nella cache non hanno timeout e rimangono memorizzati nella cache fino al riavvio della JVM (dal momento backing store è in-memory) o la cache è parzialmente o completamente cancellata (chiamando un metodo o un'azione annotata con @CacheEvict o programmaticamente). " – Gregg
Detto questo, potresti avere un cron job che colpisce un servizio web che usa @CacheEvict. È un lavoro in giro, almeno. – Gregg
Sì, ho considerato questo approccio. Per fare un passo in più, Quartz potrebbe sostituire cron per mantenere tutto all'interno dell'applicazione. Spero che il plugin cache abbia funzionato più come il plug-in della cache di primavera. – arcdegree