2013-02-12 14 views
10

Kullanıcı oturumunda (arayüz kullanırken) bir defaya mahsus bir web servisine periyodik olarak çağrı yapması gereken basit bir Grails uygulamasına sahibim.Pahalı web servis çağrısını önbelleğe almak için en iyi strateji Grails

Bu web hizmeti yanıtını önbelleğe almak istiyorum, ancak hizmetin sonuçları birkaç günde bir değişiyor, bu yüzden kısa bir süre için önbelleğe almak istiyorum (belki günlük yenilemeler).

Grails önbellek eklentisi, "yaşama süresi" uygulamalarını destekliyor görünmüyor, bu yüzden birkaç olası çözümü araştırıyorum. Bu sorunu en çok hangi eklenti veya program çözümünün çözeceğini bilmek isterim.

Örnek:

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 
    } 
} 

GÜNCELLEME

çok iyi seçenek vardı. Burt'un önerdiği eklenti yaklaşımıyla gitmeye karar verdim. Başkalarının benzer bir şey yapmak istemesine yardımcı olmak için yukarıdaki kod örneğinde küçük değişikliklerle örnek bir yanıt verdim. Bu yapılandırma, önbelleğin 24 saat sonra sona ermektedir.

BuildConfig.groovy

plugins{ 
    compile ':cache:1.1.7' 
    compile ':cache-ehcache:1.0.1' 
} 

Config.groovygrails-cache birim testler (timeToLiveSeconds arayın), sana önbellek düzeyinde önbelleğe yapılandırabilirsiniz görüyoruz itibaren

grails.cache.config = { 
    defaultCache { 
     maxElementsInMemory 10000 
     eternal false 
     timeToIdleSeconds 86400 
     timeToLiveSeconds 86400 
     overflowToDisk false 
     maxElementsOnDisk 0 
     diskPersistent false 
     diskExpiryThreadIntervalSeconds 120 
     memoryStoreEvictionPolicy 'LRU' 
    } 
} 
+0

En son önbellek eklentisini kullanarak, şu süreyi dolduramazsınız: "Bu eklenti ile" yaşam süresini "yapılandırmanın bir yolu olmadığından, önbelleğe alınan tüm öğelerin zaman aşımı yoktur ve JVM yeniden başlatılıncaya kadar önbelleğe alınır. yedekleme deposu bellek içidir) veya önbellek kısmen veya tamamen temizlenir (@CacheEvict veya program aracılığıyla eklenmiş bir yöntem veya eylem çağrılarak). " – Gregg

+0

Bu, @CacheEvict kullanan bir web servisine ulaşan bir cron işine sahip olabileceğinizi söyledi. En azından bir çalışma. – Gregg

+1

Evet, bu yaklaşımı düşündüm. Bunu bir adım daha ileriye taşımak için Quartz, her şeyi uygulama içinde tutmak için cronun yerini alabilir. Önbellek eklentisi, bahar önbellek eklentisi gibi daha fazla hareket etmesini isterdim. – arcdegree

cevap

0

, yöntem çağrısı veya benzeri başına değil. Bu yöntemi kullanarak, grails.cache.config ayarlarını yapılandırabilirsiniz.

Zaman aşımına uğramış ayarlarınızla özel bir önbellek oluşturabilir ve ardından hizmetinize referans gösterebilirsiniz.

+0

Evet, bunu yapmamın tek yolu budur, ancak bu eklenti kullanımdan kaldırılmıştır. Dokümanlardan: "Bu eklenti artık korunmuyor. SpringSource tarafından geliştirilen ve desteklenen önbellek eklentisi tarafından onaylandı." – arcdegree

+0

Testlerin aslında testin bir parçası olarak desteklenmeyen yapılandırmayı ayarladıklarına inanıyorum. –

1

bir hack/geçici çözüm @Cacheable bir arada kullanmak olacaktır ("itemsCache" (böylece hem yüklü gerek)) ve @CacheFlush ("itemsCache").

Sonuçları önbelleğe almak için getItems() yöntemini söyleyin. ve daha sonra bir İş'ten sık arayabileceğiniz önbelleği temizlemek için başka bir hizmet yöntemidir.

@CacheFlush("itemsCache") 
def flushItemsCache() {} 
0

SpEL ile yapılan savaşlarda birkaç saat sonra başarısız olduktan sonra savaşı sonunda kazandım! Böylece, Grails önbelleğinin kutunun dışında TTL bulunmadığını biliyorsunuz. Ehcache'ye yapışabilir ve bazı şık konfigürasyonlar yapabilirsiniz. Ya da daha kötüsü/güncelleme vb kaydet bunu basması mantığı eklemek Ama çözümdür:

@Cacheable(value = 'domainInstance', key="#someId.concat((new java.util.GregorianCalendar().getTimeInMillis()/10000))") 
def getSomeStuffOfDb(String someId){ 
     //extract something of db 
    }  
} 

ve bir şey daha işaret etmek. Config.groovy'deki konfigürasyonu atlayabilir ve otomatik olarak oluşturulacak ve eklenecektir. Bununla birlikte, uygulamanız yüklendikten sonra doğrudan yük altındaysa bazı istisnalara neden olacaktır.

2017-03-02 14:05:53,159 [http-apr-8080-exec-169] ERROR errors.GrailsExceptionResolver - CacheException occurred when processing request: [GET] /some/get 
Failed to get lock for campaignInstance cache creation. Stacktrace follows: 

böylece önbellek tesisleri önceden hazır olacak böylece yapılandırma ekleyin önlemek için. GregorianCalendar(). GetTimeInMillis()

grails.cache.enabled = true 
grails.cache.clearAtStartup = true 
grails.cache.config = { 
    defaults { 
     maxElementsInMemory 10000 
     overflowToDisk false 
    } 
    cache { 
     name 'domainInstance' 
    } 
} 

/10000 ~ 10 sn TTL yapacaktır./1000 ~ 1 sn. Saf matematikler burada.

İlgili konular