2017-06-16 119 views
1

在此的CacheManager当时间限制与getTimeToLive(超过)ehCache缓存是否有任何自动刷新选项?没有任何调度程序的工作?

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

@ Anant666是我们可以尝试,但在我的情况下,我必须清除缓存而不使用任何作业或调度程序。 – 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

在我在获得timeToLiveExpiration正确的情况下, 但是当我使用该行来检查当前的时间留给 rateShopCache.getRateShopCacheFromCacheManager()的containsKey(标识) 其存储静态值永远不会刷新它,只要时间得到已过期 – SGG

+0

有没有什么方法,我可以设置时间为12:00 am,并自动刷新缓存@Henri – SGG

+0

最简单的方法是让调度程序在上午12:00之前清空缓存。它可以选择立即加载新值(使用'put'或'get'和一个加载器)。另一种解决方案是使用计算每个条目在午夜过期的自定义期满。我已经用代码示例更新了我的答案。 – Henri

0

我以到期类使用日历实例尝试,

公共类CustomExpiry实现到期{

@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; 

} 

}

相关问题