春のキャッシュの削除を毎日深夜にスケジュールすることはできますか?
私は Springs Cache Docs を読み、スケジュールされたキャッシュの削除について何も見つかりませんでした。
アプリケーションの外部で変更があった場合に備えて、キャッシュを毎日削除し、再キャッシュする必要があります。
@Scheduledの例を使用してみてください:
@Scheduled(fixedRate = ONE_DAY)
@CacheEvict(value = { CACHE_NAME })
public void clearCache() {
}
@Scheduledでcron式を使用することもできます。
パラメータを持つメソッドで@Cacheableを使用する場合、@ CacheEvictのallEntries = trueアノテーションプロパティを決して忘れないでください。それ以外の場合、呼び出しはclearCache()メソッドに指定したキーパラメータのみを削除します。これは何も=>キャッシュから何も追い出しません。
Springキャッシュフレームワークはイベントドリブンです。つまり、@Cacheable
または@CacheEvict
は、それぞれのメソッドが呼び出されたときにのみトリガーされます。
ただし、基盤となるキャッシュプロバイダーを利用して(Springキャッシュフレームワークは単なる抽象化であり、それ自体ではキャッシュソリューションを提供しない)キャッシュを無効化できます単独で。たとえば、EhCacheにはプロパティvizがあります。 timeToLiveSeconds
は、キャッシュがアクティブになるまでの時間を示します。ただし、@Cacheable
アノテーション付きメソッドが呼び出されない限り、これによってキャッシュが再生成されることはありません。
したがって、特定の時間でのキャッシュの削除と再設定については(前述のように真夜中と言います)バックグラウンドの実装を検討してください スケジュールされたサービス Springこれにより、必要に応じてキャッシュの削除と再設定がトリガーされます。予期された動作はそのままでは提供されません。
お役に立てれば。
私はこの質問が古いことを知っていますが、私に役立つより良い解決策を見つけました。多分それは他の人を助けるでしょう。
したがって、スケジュールされたキャッシュの削除を行うことは確かに可能です。これが私が私の場合にしたことです。
@Scheduledと@CacheEvictの両方のアノテーションが一緒に機能していないようです。したがって、スケジューリング方式とキャッシュ排除方式を分離する必要があります。ただし、メカニズム全体がプロキシに基づいているため、クラスのパブリックメソッドへの外部呼び出しのみがキャッシュの削除をトリガーします。これは、同じクラスのメソッド間の内部呼び出しがSpringプロキシを経由しないためです。
セレベスと同じ方法で修正しましたが(コメントを参照)、2つのコンポーネントを回避するように改善されました。
@Component
class MyClass
{
@Autowired
MyClass proxiedThis; // store your component inside its Spring proxy.
// A cron expression to define every day at midnight
@Scheduled(cron ="0 0 * * *")
public void cacheEvictionScheduler()
{
proxiedThis.clearCache();
}
@CacheEvict(value = { CACHE_NAME })
public void clearCache()
{
// intentionally left blank. Or add some trace info.
}
}