2012-12-18 44 views
9

Sto lavorando con ehcache 2.5.4.ehcache in base alla data

Ho un oggetto che deve essere memorizzato nella cache per tutto il giorno e aggiornato con un nuovo valore alle 00:00 di ogni giorno.

Attualmente con le configurazioni ehcache posso solo impostare il tempo di vita e il tempo di inattività, ma ciò dipenderà dal momento in cui ho creato l'oggetto o quando viene utilizzato. vale a dire:

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

C'è un modo per ottenere EHCache per scadere cache specifici in base ai momenti specifici.

+2

Non è possibile direttamente. Che dire dell'utilizzo di un trigger CRON esterno ([tag: quartz-scheduler]?) Per cancellare manualmente la cache? –

risposta

10

Ho fatto questo estendendo la classe di EHCache Element in questo modo:

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

Il resto è facile come mettere nuova istanza EvictOnGivenTimestampElement oggetto nella cache invece di Element.

Il vantaggio di questo approccio è che non devi preoccuparti di cronjobs esterni, ecc.

+0

Sembra un modo davvero carino di farlo. Posso farlo con annotazione? O devo creare manualmente il CacheManager. Lo sto usando con Spring e Hibernate. – JackDev

+0

'Element' è un concetto molto basilare di Ehcache e non ha relazioni dirette con' CacheManager'. Per quanto riguarda le annotazioni, non ho idea perché non uso annotazioni ... Se si desidera impostare la scadenza nell'annotazione che è improbabile che sia supportata ma è sempre possibile implementare la propria estensione che funziona nel modo desiderato. – mindas

4

EHCache supporta solo lo sfratto dopo un certo periodo di tempo (sia nella cache che per inattività). Tuttavia, si dovrebbe essere in grado di raggiungere questo abbastanza facilmente programmando la rimozione con qualcosa di simile:

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

Questo esempio di base utilizza la classe Java Timer per illustrare, ma qualsiasi scheduler potrebbero essere utilizzati. Ogni 24 ore, a partire da mezzanotte, questo esegue e rimuove tutti gli elementi dalla cache specificata. Il metodo effettivo run potrebbe essere modificato per rimuovere anche gli elementi che corrispondono a determinati criteri.

Avresti solo bisogno di assicurarti di avviarlo all'avvio dell'applicazione.

2

Con Ehcache 3.2 ho implementato un'estensione 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; 
    } 
} 

Ora, ho anche la registrazione ecc. Ma ho ridotto al minimo il mio codice per la pulizia.

Quindi è sufficiente configurarlo nel builder di configurazione.

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

Chiaramente EHCache migliorato in là API po 2,5-3,2 come non è necessario per creare il proprio 'elemento' e assicurarsi che sia l'utilizzo di avviare politiche di scadenza o di sfratto. Le politiche sono ora vincolate alla cache.

Problemi correlati