Java ehCache是否有自动刷新选项?没有任何调度程序作业?

Java ehCache是否有自动刷新选项?没有任何调度程序作业?,java,ehcache,ehcache-3,Java,Ehcache,Ehcache 3,在这种情况下,当超过时间限制时,cacheManager不会使用getTimeOlive()自动刷新 你可以。一旦缓存值过期,它将加载新值 然后,在访问时测试值是否过期。所以,如果您想让它在后台过期并只使用Ehcache进行预取,目前是不可能的。总的来说,这是没有必要的 如果您真的想这样做,您确实需要自己的调度程序,它将定期获取值以使其过期并预取(通过使用加载程序或放置新值) 如果您想知道,如果Ehcache是在内部执行的,我们会安排清道夫和预取任务。因此,无论谁在做这件事,都需要安排好工作 答

在这种情况下,当超过时间限制时,cacheManager不会使用getTimeOlive()自动刷新

你可以。一旦缓存值过期,它将加载新值

然后,在访问时测试值是否过期。所以,如果您想让它在后台过期并只使用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)) {

  // ...
}

我已经尝试过通过使用Expiry类使用calendar实例

公共类CustomExpire实现到期{

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

}

}

在我的例子中,它的get-time-ToLiveExpiration正确,但当我使用此行检查当前剩余时间rateShopCache.getRateShopCacheFromCacheManager().ContainersKey(标识符)时,它存储静态值&每当time-get-Expire存在任何方法时,都不会刷新它,我可以将时间设置为12:00 am&缓存自动刷新@Henri最简单的方法是让调度器在12:00 am清除缓存。可以选择立即加载新值(使用
put
get
和加载器)。另一种解决方案是使用自定义到期日,计算每个条目在午夜到期。我已经用一个代码示例更新了我的答案。@Anant666是的,我们可以尝试,但在我的情况下,我必须清除缓存,而不使用任何作业或计划程序。
@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;

}