2009-10-07 14 views
7

मैं इसस्प्रिंग संदर्भ संपत्ति-placholder ehcahe विन्यास

<context:property-placeholder location="classpath:cacheConfig.properties"/> 

<bean id="cacheManager" 
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
    <property name="cacheManagerName" value="cacheName"/> 
    <property name="shared" value="false"/> 
    <property name="configLocation" value="classpath:cacheConfig.xml"/> 
</bean> 

लक्ष्य के साथ एक वसंत संदर्भ xml फ़ाइल है इस

cache.maxMemoryElements="2000" 

और उसके बाद की तरह, ग्राहक गुण फ़ाइल संपादित करने के लिए अनुमति देने के लिए है वास्तविक cacheConfig.xml फ़ाइल में यह

<cache name="someCacheName" 
    maxElementsInMemory="${cache.maxMemoryElements}" ... /> 

ताकि आइटम हम ग्राहक को ch नहीं चाहते हैं एंज का खुलासा नहीं किया गया है। निस्संदेह विवरण केवल आंशिक रूप से विस्तृत हैं और काम नहीं कर रहे हैं। वर्तमान में मैं

Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Error configuring from input stream. Initial cause was null:149: Could not set attribute "maxElementsInMemory". 

अग्रिम धन्यवाद ...

उत्तर

12

CacheManager के संदर्भ का खुलासा करने के लिए आपका उदाहरण EhCacheManagerFactoryBean का उपयोग करता है, बाहरी cacheConfig.xml फ़ाइल में परिभाषित कैश के साथ। जैसा कि @ ChssPly76 ने इंगित किया है, वसंत की संपत्ति रिज़ॉल्वर केवल स्प्रिंग की अपनी बीन परिभाषा फ़ाइलों के भीतर काम करता है।

हालांकि, अगर आप बाहरी फ़ाइल में अलग-अलग कैश को परिभाषित करने की जरूरत नहीं है, आप सही वसंत सेम परिभाषा फ़ाइल के भीतर उन्हें परिभाषित कर सकते हैं EhCacheFactoryBean का उपयोग कर:

FactoryBean है कि एक नामित ehcache कैश बनाता है उदाहरण ... निर्दिष्ट नामित कैश कैश विन्यास वर्णनकर्ता में कॉन्फ़िगर नहीं है, तो यह FactoryBean एक कैश का एक उदाहरण के साथ प्रदान की नाम और निर्दिष्ट कैश गुण का निर्माण औरमें जोड़ देगा बाद में पुनर्प्राप्ति के लिएकैशमेनगर।

दूसरे शब्दों में, यदि आप EhCacheFactoryBean का प्रयोग कर एक नामित कैश कि पहले से ही cacheConfig.xml में निर्धारित नहीं है का उल्लेख करने के लिए, तो वसंत बना सकते हैं और एक नया कैश उदाहरण कॉन्फ़िगर और रनटाइम पर CacheManager से पंजीकृत होगा।यही कारण है कि maxElementsInMemory जैसी चीजों को निर्दिष्ट शामिल है, और क्योंकि यह वसंत सेम परिभाषा फ़ाइल में निर्दिष्ट किया जाएगा, तो आप संपत्ति समाधानकर्ता का पूरा समर्थन प्राप्त:

<context:property-placeholder location="classpath:cacheConfig.properties"/> 

<bean id="myCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> 
    <property name="cacheManager" ref="cacheManager"/> 
    <property name="maxElementsInMemory" value="${cache.maxMemoryElements}"/> 
</bean> 

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
    <property name="shared" value="false"/> 
    <property name="configLocation" value="classpath:cacheConfig.xml"/> 
</bean> 
+0

धन्यवाद! यह मुझे इतनी कूबड़ पर ले जाता है कि मैं उस बिंदु पर पहुंच सकता हूं जिसे मैं चाहूंगा। –

+3

क्या होगा यदि आप ऐसा कुछ कॉन्फ़िगर करना चाहते हैं जो कैश नहीं है? उदाहरण के लिए, कैशमेनगर पीयर लिस्टनर फैक्ट्री की एक संपत्ति? –

3

यह कैसे काम करता है PropertyPlaceholderConfigurer नहीं है लॉग फ़ाइल में यह देखते हैं। इसका उपयोग को संदर्भ के भीतर मानने के लिए किया जा सकता है, लेकिन मनमानी बाहरी फ़ाइलों के भीतर नहीं। और cacheConfig.xml एक बाहरी फ़ाइल है - यह बस वसंत से ईएच कैश द्वारा पारित किया जा रहा है।

2

यदि आप मेवेन या चींट का उपयोग कर रहे हैं, तो दोनों संसाधन फ़ाइलों में टोकन को फ़िल्टर करने की क्षमता प्रदान करते हैं।

Maven के लिए, आप

<cache name="someCacheName" 
    maxElementsInMemory="${cache.maxMemoryElements}" ... /> 

की तरह और एक फिल्टर फाइल में कुछ कर सकते हैं, या पोम अपने आप में,

cache.maxMemoryElements = 200 

Resource Filtering in Maven: The Definitive Guide

चींटी के साथ

, यदि आप ऐसा करते है FilterSets और <copy> कार्य के साथ।

+1

+1, लेकिन महत्वपूर्ण बात यह है यह ध्यान में रखना कि एंटी और मैवेन संपत्ति प्रतिस्थापन दोनों के साथ ** निर्माण समय ** के दौरान होता है क्योंकि वसंत की संपत्ति प्लेसहोल्डर के विपरीत जहां यह रनटाइम के दौरान होता है। – ChssPly76

+0

हाँ, महान बिंदु –

2

जो कोई diskstore पथ जो के रूप में स्थापित नहीं किया जा सकता संशोधित करने की जरूरत के लिए ehcache javadoc का कहना है कि डिस्कस्टोर पैरामीटर को अनदेखा किया जाता है, आप एह कैश मैनेजर फैक्ट्रीबीन का अपना कार्यान्वयन बना सकते हैं, जो आपको डिस्कस्टोर पथ को इंजेक्ट करने की अनुमति देता है; आप मूल रूप से CacheManager के निर्माण रोकना और विन्यास अपने diskstore संपत्ति का उपयोग कर के साथ पारित कर दिया, जैसे संशोधित करने की आवश्यकता:

private String diskStorePath; 

...getter/setter 


public void afterPropertiesSet() throws IOException, CacheException { 
    if (this.shared) { 
     // Shared CacheManager singleton at the VM level. 
     if (this.configLocation != null) { 
      this.cacheManager = CacheManager.create(this.createConfig()); 
     } 
     else { 
      this.cacheManager = CacheManager.create(); 
     } 
    } 
    else { 
     // Independent CacheManager instance (the default). 
     if (this.configLocation != null) { 
      this.cacheManager = new CacheManager(this.createConfig()); 
     } 
     else { 
      this.cacheManager = new CacheManager(); 
     } 
    } 
    if (this.cacheManagerName != null) { 
     this.cacheManager.setName(this.cacheManagerName); 
    } 
} 

private Configuration createConfig() throws CacheException, IOException { 
    Configuration config = ConfigurationFactory.parseConfiguration(this.configLocation.getInputStream()); 

    DiskStoreConfiguration diskStoreConfiguration = config.getDiskStoreConfiguration(); 
    if (diskStoreConfiguration == null) { 
     DiskStoreConfiguration diskStoreConfigurationParameter = new DiskStoreConfiguration(); 
     diskStoreConfigurationParameter.setPath(getDiskStorePath()); 
     config.addDiskStore(diskStoreConfigurationParameter); 
    } else { 
     diskStoreConfiguration.setPath(getDiskStorePath()); 
    } 

    return config; 
} 

स्प्रिंग config तो इस तरह दिखता है:

<bean id="cacheManager" class="com.yourcompany.package.MyEhCacheManagerFactoryBean" depends-on="placeholderConfig"> 
    <property name="diskStorePath" value="${diskstore.path}"/> 
    <property name="configLocation" value="classpath:ehcache.xml" /> 
</bean> 
+0

बस मेरे लिए यह उपयोगी पोस्ट पोस्ट करने के लिए: यदि आपको किसी jndi प्रॉपर्टी तक पहुंचने की आवश्यकता है तो आप इसे इसके माध्यम से सेट कर सकते हैं: Martin

संबंधित मुद्दे