2012-12-18 18 views
9

Pracuję z ehcache 2.5.4.ehcache na podstawie daty

Mam obiekt, który musi być buforowany przez cały dzień i odświeżany o nową wartość o 00:00 każdego dnia.

Obecnie z konfiguracjami ehcache mogę ustawić tylko czas, w którym mam żyć i czas, ale zależy to od czasu, w którym utworzyłem obiekt lub kiedy go użyłem. tj:

<cache 
    name="cache.expiry.application.date_status" 
    maxElementsInMemory="10" 
    eternal="false" 
    timeToIdleSeconds="60" 
    timeToLiveSeconds="50" /> 

Czy istnieje sposób na to, aby ehcache wygasało z określonych pamięci podręcznych w określonych godzinach.

+2

Nie można bezpośrednio. A co z wykorzystaniem zewnętrznego wyzwalacza CRON ([tag: kwarc-scheduler]?), Aby ręcznie wyczyścić pamięć podręczną? –

Odpowiedz

10

Robiłem to poprzez rozszerzenie Element klasę ehcache jest tak:

class EvictOnGivenTimestampElement extends Element { 

    private static final long serialVersionUID = ...; 
    private final long evictOn; 

    EvictOnGivenTimestampElement(final Serializable key, final Serializable value, final long evictOn) { 
     super(key, value); 
     this.evictOn = evictOn; 
    } 

    @Override 
    public boolean isExpired() { 
     return System.currentTimeMillis() > evictOn; 
    } 
} 

Reszta jest tak proste, jak wprowadzenie nowej instancji EvictOnGivenTimestampElement obiektu do pamięci podręcznej zamiast Element.

Zaletą tego podejścia jest to, że nie musisz się martwić o zewnętrzne cronjobs itp. I oczywistą wadą jest przywiązanie do API Ehcache, które, mam nadzieję, nie zmieni się zbyt często.

+0

Wydaje się, że to naprawdę dobry sposób na zrobienie tego. Czy mogę to zrobić z adnotacją? Czy muszę ręcznie utworzyć CacheManager. Używam go ze Spring i Hibernate. – JackDev

+0

'Element' jest bardzo podstawową koncepcją Ehcache i nie ma bezpośrednich relacji z' CacheManager'. Co do adnotacji - nie mam pojęcia, ponieważ nie używam adnotacji ... Jeśli chcesz ustawić wygasanie w adnotacji, która prawdopodobnie nie będzie obsługiwana, ale zawsze możesz rozwinąć własne rozszerzenie, które działa tak, jak chcesz. – mindas

4

EHCache obsługuje eksmisje dopiero po pewnym czasie (zarówno w pamięci podręcznej, jak i bezczynności). Jednakże, powinno być możliwe do osiągnięcia, że ​​dość łatwo poprzez szeregowanie usunięcie z czymś takim:

Timer t = new Timer(true); 
    Integer interval = 24 * 60 * 60 * 1000; //24 hours 
    Calendar c = Calendar.getInstance(); 
    c.set(Calendar.HOUR, 0); 
    c.set(Calendar.MINUTE, 0); 
    c.set(Calendar.SECOND, 0); 


    t.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 
       Cache c = //retrieve cache     
       c.removeAll();            
      } 
     }, c.getTime(), interval); 

Ten podstawowy przykład wykorzystuje klasę Java Timer w celu zilustrowania, ale każdy planista może być wykorzystana. Co 24 godziny, poczynając od północy - uruchamiałoby się i usuwał wszystkie elementy z określonej pamięci podręcznej. Rzeczywista metoda run może zostać zmodyfikowana w celu usunięcia elementów pasujących również do określonych kryteriów.

Po prostu trzeba się upewnić, że uruchomisz go po uruchomieniu aplikacji.

2

Z Ehcache 3.2 zaimplementowałem rozszerzenie Expiry.

public class EvictAtMidnightExpiry implements Expiry { 

    @Override 
    public Duration getExpiryForCreation(Object key, Object value) { 
     DateTime now = new DateTime(); 
     DateTime resetAt = now.plusDays(1).withTimeAtStartOfDay(); 
     long difference = resetAt.toDateTime().getMillis() - now.getMillis(); 
     return Duration.of(difference, TimeUnit.MILLISECONDS); 
    } 

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

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

Teraz mam również logowanie itd., Ale zminimalizowałem kod pod kątem czystości.

Następnie wystarczy skonfigurować go w narzędziu do konfiguracji konfiguracji.

CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, String.class, ResourcePoolsBuilder.heap(1000)).withExpiry(new EvictAtMidnightExpiry()).build() 

Wyraźnie poprawiła ehcache tam API nieco od 2,5 do 3,2, jak nie trzeba tworzyć własną „element” i zapewnić, że to wykorzystanie do zainicjowania polityki wygaśnięcia lub eksmisji. Zasady są teraz buforowane.

Powiązane problemy