2012-12-18 17 views
9

पर आधारित मैं ehcache 2.5.4 के साथ काम कर रहा हूं।ehcache दिनांक

मैंने किसी चीज़ हर दिन 00:00 तक बजे दिन बाहर के माध्यम से कैश की गई और एक नया मान के साथ रीफ़्रेश करने की आवश्यकता है।

वर्तमान में ehcache विन्यास के साथ मैं केवल समय रहने के लिए और समय निष्क्रिय सेट कर सकते हैं, लेकिन उस समय मैं वस्तु बनाया है या जब यह प्रयोग किया जाता है पर निर्भर करेगा। यानी:

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

विशिष्ट समय के आधार पर विशिष्ट कैश की समाप्ति के लिए ehcache प्राप्त करने का कोई तरीका है।

+2

यह संभव नहीं है। उस कैश को मैन्युअल रूप से साफ़ करने के लिए बाहरी CRON ट्रिगर ([टैग: क्वार्ट्ज-शेड्यूलर]?) का उपयोग करने के बारे में क्या? –

उत्तर

10

मैं बहुत तरह ehcache के Element वर्ग का विस्तार करके यह कर दिया है:

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

बाकी नया उदाहरण Element के बजाय कैश में EvictOnGivenTimestampElement वस्तु की डाल के रूप में के रूप में आसान है।

इस दृष्टिकोण का लाभ यह है कि आपको बाहरी cronjobs, आदि के बारे में चिंता करने की ज़रूरत नहीं है और स्पष्ट नुकसान Ehcache API से अनुलग्नक है जो मुझे आशा है कि मैं अक्सर नहीं बदलूंगा।

+0

ऐसा करने का वास्तव में साफ तरीका लगता है। क्या मैं इसे एनोटेशन के साथ कर सकता हूं? या मुझे मैन्युअल रूप से CacheManager बनाने की आवश्यकता है। मैं इसे वसंत और हाइबरनेट के साथ उपयोग कर रहा हूं। – JackDev

+0

'एलिमेंट' एशैच की एक बहुत ही बुनियादी अवधारणा है, और इसका 'कैशमेनगर' से कोई सीधा संबंध नहीं है। एनोटेशन के संबंध में - मुझे कोई जानकारी नहीं है क्योंकि मैं एनोटेशन का उपयोग नहीं करता हूं ... यदि आप एनोटेशन में समाप्ति सेट करना चाहते हैं जो समर्थित होने की संभावना नहीं है लेकिन आप हमेशा अपना खुद का एक्सटेंशन रोल कर सकते हैं जो आप चाहते हैं। – mindas

4

ehcache केवल समय की एक निश्चित अवधि के बाद बेदखली का समर्थन करता है (या तो निष्क्रियता के कैश में या कारण किया जा रहा है)। हालांकि, आपको लगता है कि पूरा करने के लिए काफी आसानी से कुछ इस तरह से हटाने से निर्धारित कर सक्षम होना चाहिए:

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

यह बुनियादी उदाहरण वर्णन करने के लिए जावा टाइमर वर्ग का उपयोग करता है, लेकिन किसी भी अनुसूचक उपयोग किया जा सकता। मध्यरात्रि से शुरू होने वाले प्रत्येक 24 घंटे - यह निर्दिष्ट कैश से सभी तत्वों को चलाएगा और निकाल देगा। एक निश्चित मानदंड से मेल खाने वाले तत्वों को हटाने के लिए वास्तविक run विधि भी संशोधित की जा सकती है।

तुम बस सुनिश्चित करें कि आप इसे शुरू करने के लिए जब आवेदन शुरू कर दिया है बनाने की जरूरत है चाहता हूँ।

2

एशैच 3.2 के साथ मैंने एक समाप्ति विस्तार लागू किया।

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

अब, मेरे पास लॉगिंग आदि भी है लेकिन मैंने स्वच्छता के लिए अपना कोड छोटा कर दिया है।

फिर आपको इसे अपने कॉन्फ़िगरेशन बिल्डर में कॉन्फ़िगर करने की आवश्यकता है।

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

जाहिर ehcache वहाँ एपीआई पर कुछ हद तक 2.5 से 3.2 करने के लिए सुधार के रूप में आप अपने खुद के 'तत्व' बनाने और इसे समाप्ति या निष्कासन नीतियों आरंभ करने के लिए उपयोग है सुनिश्चित करने के लिए जरूरत नहीं है। नीतियां अब कैश बाध्य हैं।