2017-06-16 11 views
1

は、オートリフレッシュタイムリミットがにgetTimeToLive(と超過)ehCacheキャッシュには自動リフレッシュのオプションがありますか?スケジューラの仕事なしで?このCacheManagerので

private void setCacheInstance() { 
    cacheManager 
      .createCache("rateDataCached", CacheConfigurationBuilder 
        .newCacheConfigurationBuilder(
          Integer.class, PostageServicesResultHolder.class, 
          ResourcePoolsBuilder.heap(100)) 
        .withExpiry(Expirations.timeToLiveExpiration(Duration.of(getTimeToLive(), TimeUnit.MINUTES))).build()); 
} 

private long getTimeToLive() { 
    Calendar cal = Calendar.getInstance(); 
    SimpleDateFormat sdf = new SimpleDateFormat("HH.mm"); 
    Float currentTime = Float.parseFloat(sdf.format(cal.getTime())); 
    return (long) ((24.00-currentTime) * 60); 
} 
+0

を実装する:ここで、そのためのサンプルコードであります私はそれを試すことができますが、私の場合は、私はジョブやスケジューラを使用せずにキャッシュをクリアする必要があります。その取得timeToLiveExpirationで私の場合は – SGG

答えて

2

することができますconfigure a loaderません。キャッシュされた値が失効するとすぐに新しい値がロードされます。

次に、アクセス時に値の有効期限がテストされます。だから、それをバックグラウンドで期限切れにすることは現時点では不可能で、Ehcacheだけを使ってプリフェッチすることは、あなたがしたいと思っていたならば不可能です。とにかくそれは一般的には不要です。

本当にしたいのであれば、値を定期的に取得してプリフェッチするスケジューラを所有している必要があります(ローダを使用するか、新しい値を入力してください)。

Ehcacheが内部的に行っているのであれば、スカベンジャとプリフェッチャのタスクをスケジューリングすることになります。だから、それをやっている人は、スケジュールされた仕事が必要です。

コメントに答えます。真夜中にすべてのエントリを期限切れにするには、各エントリの真夜中までの時間を計算するカスタムの有効期限を使用できます。私は有効期限クラスを使用してカレンダ・インスタンスを使用して試みた

Expiry expiry = new Expiry() { 
    @Override 
    public Duration getExpiryForCreation(Object key, Object value) { 
    long msUntilMidnight = LocalTime.now().until(LocalTime.MAX, ChronoUnit.MILLIS); 
    return Duration.of(msUntilMidnight, TimeUnit.MILLISECONDS); 
    } 

    @Override 
    public Duration getExpiryForAccess(Object key, ValueSupplier value) { 
    return null; 
    } 

    @Override 
    public Duration getExpiryForUpdate(Object key, ValueSupplier oldValue, Object newValue) { 
    return null; 
    } 
}; 

try(CacheManager cm = CacheManagerBuilder.newCacheManagerBuilder() 
    .withCache("cache", 
    CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, 
     ResourcePoolsBuilder.newResourcePoolsBuilder() 
     .heap(10)) 
    .withExpiry(expiry)) 
     .build(true)) { 

    // ... 
} 
+0

正しく、 しかし、私は、現在の時刻が、それは静的な値を格納&時間が取得するたびに、それを更新したことがない rateShopCache.getRateShopCacheFromCacheManager()。のcontainsKey(識別子)を左にチェックするために、このラインを使用する場合有効期限が切れた – SGG

+0

私は午前12時とキャッシュを自動的にリフレッシュする方法がありますか?@Henri – SGG

+0

これを行う最も簡単な方法は、午前12時にキャッシュをクリアするスケジューラを持つことです。オプションで、新しい値をすぐに読み込むことができます( 'put'または' get'とローダーを使用して)。もう1つの解決策は、深夜に期限切れになる各エントリを計算するカスタムの有効期限を使用することです。私はコードサンプルで自分の答えを更新しました。 – Henri

0

パブリッククラスCustomExpiryがYES有効期限{

@Override 
public Duration getExpiryForCreation(Object key, Object value) { 
    return Duration.of(getTimeToLive(), TimeUnit.MILLISECONDS); 
} 

@Override 
public Duration getExpiryForAccess(Object key, ValueSupplier value) { 
    return null; 
} 

@Override 
public Duration getExpiryForUpdate(Object key, ValueSupplier oldValue, Object newValue) { 
    return null; 
} 

private long getTimeToLive() { 
    Calendar now = Calendar.getInstance(); 
    Calendar midnight = Calendar.getInstance(); 

    midnight.set(Calendar.HOUR_OF_DAY,0); 
    midnight.set(Calendar.MINUTE,0); 
    midnight.set(Calendar.SECOND,0); 
    midnight.set(Calendar.MILLISECOND,0); 
    midnight.add(Calendar.DATE, 1); 

    long difference = midnight.getTimeInMillis() - now.getTimeInMillis(); 
    System.out.println("caching time : "+ difference); 
    return difference; 

} 

} Anant666 @

関連する問題