ユーザーのセッション中に(インターフェイスを使用している間に)外部Webサービスへの定期的な呼び出しを行う必要がある単純なGrailsアプリケーションがあります。Grailsで高価なWebサービスコールをキャッシュするためのベストプラクティス
私はこのWebサービスの応答をキャッシュしたいと思いますが、サービスの結果は数日おきに変更されるため、短時間(毎日リフレッシュ)キャッシュしたいと思います。
Grailsキャッシュプラグインは「実装可能」な実装をサポートしていないようですので、いくつかの解決策を検討しています。私はこの問題を最もよく解決するプラグインまたはプログラムの解決策を知りたいと思っています。
例:
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
多くの良いオプションがありました。私は、バルト氏が提案したプラグインのアプローチを採用することに決めました。私は上記のコード例のマイナーな変更を加えたサンプル回答を含めて、他の人が似たようなことをしたいときに役立てています。この構成では、24時間後にキャッシュが失効します。
BuildConfig.groovy
plugins{
compile ':cache:1.1.7'
compile ':cache-ehcache:1.0.1'
}
Config.groovygrails-cacheユニットテスト(timeToLiveSecondsを探してください)、私はあなたがキャッシュ・レベルでのキャッシングを構成することができていることがわかりから
grails.cache.config = {
defaultCache {
maxElementsInMemory 10000
eternal false
timeToIdleSeconds 86400
timeToLiveSeconds 86400
overflowToDisk false
maxElementsOnDisk 0
diskPersistent false
diskExpiryThreadIntervalSeconds 120
memoryStoreEvictionPolicy 'LRU'
}
}
最新のキャッシュプラグインを使用すると、期限切れになることはありません: "このプラグインを使用して"有効期限 "を設定する方法はないので、キャッシュされたアイテムはタイムアウトがなく、JVMが再起動するまたは@CacheEvictで注釈を付けられたメソッドやアクションをプログラムで呼び出すことによって)キャッシュが部分的または完全にクリアされていることを確認します。 – Gregg
つまり、@CacheEvictを使用するWebサービスにヒットするcronジョブを持つことができます。それは、少なくとも、回避策です。 – Gregg
はい、私はそのアプローチを考えました。さらに進歩を遂げるために、Quartzはcronの代わりにアプリケーション内のすべてを保持することができます。私は、キャッシュプラグインがスプリングキャッシュプラグインのようにもっとうまく動作することを願っています。 – arcdegree