2010-11-03 10 views
5

मेरे पास एक प्रॉपर्टी फ़ाइल है और स्प्रिंग प्रॉपर्टी प्लेस धारक का उपयोग करके, मैंने स्प्रिंग बीन्स को मान सेट किया है। अब, इस संपत्ति फ़ाइल को रन टाइम के दौरान संशोधित किया जा सकता है। क्या इस नव संशोधित संपत्ति मूल्य के साथ वसंत बीन्स के गुणों को ताज़ा करने का कोई तरीका है? विशेष रूप से, मेरे पास कई सिंगलटन बीन्स हैं? मैं उन्हें नए मूल्यों से कैसे ताज़ा कर सकता हूं? क्या इसका पहले से कोई समाधान है या इसे कस्टम कोड किया जाना चाहिए? यदि यह पहले से मौजूद नहीं है, तो क्या कोई इसे प्राप्त करने के लिए सबसे अच्छा तरीका दे सकता है? धन्यवाद!वसंत - नई संपत्ति फ़ाइल मानों के साथ बीन संपत्ति मूल्यों को प्रतिस्थापित करना

पीएस: मेरा आवेदन बैच एप्लिकेशन है। मैं बैचों को शेड्यूल करने के लिए स्प्रिंग आधारित क्वार्ट्ज कॉन्फ़िगरेशन का उपयोग करता हूं।

उत्तर

3

मैं संदर्भ के लिए इस में छोड़ देंगे, लेकिन अद्यतन जवाब विभक्त नीचे है:

खैर ConfigurableApplicationContext इंटरफ़ेस एक refresh() विधि है, जो होना चाहिए कि आप क्या चाहते हैं, लेकिन सवाल यह है: कैसे उपयोग करने के लिए वह विधि

private ConfigurableApplicationContext context; 
@Autowired 
public void setContext(ConfigurableApplicationContext ctx){ 
    this.context = ctx; 
} 

अब दो मूल विकल्प मेरा सुझाव था होगा या तो

  1. Task Execution Framework का उपयोग करें: जिस तरीके से आप इसे करते हैं, आप एक सेम प्रकार ConfigurableApplicationContext की निर्भरता है कि के साथ शुरू करेंगे और अपने बीन को संपत्ति संसाधनों को नियमित रूप से देखते हैं, जब एप्लिकेशन में परिवर्तन मिलता है या
  2. expose the bean to JMX आपको रीफ्रेश को मैन्युअल रूप से ट्रिगर करने की अनुमति देता है।

टिप्पणियों का जिक्र करते हुए: के बाद से यह पूरे संदर्भ को ताज़ा करने के लिए असंभव लगता है, एक वैकल्पिक रणनीति एक गुण कारखाने सेम बना सकते हैं और इंजेक्षन कि अन्य सभी बीन्स में होगा।

public class PropertiesFactoryBean implements FactoryBean<Properties>{ 

    public void setPropertiesResource(Resource propertiesResource){ 
     this.propertiesResource = propertiesResource; 
    } 

    private Properties value=null; 
    long lastChange = -1L; 

    private Resource propertiesResource; 

    @Override 
    public Properties getObject() throws Exception{ 
     synchronized(this){ 
      long resourceModification = propertiesResource.lastModified(); 
      if(resourceModification != lastChange){ 
       Properties newProps = new Properties(); 
       InputStream is = propertiesResource.getInputStream(); 
       try{ 
        newProps.load(is); 
       } catch(IOException e){ 
        throw e; 
       } finally{ 
        IOUtils.closeQuietly(is); 
       } 
       value=newProps; 
       lastChange= resourceModification; 
      } 
     } 
     // you might want to return a defensive copy here 
     return value; 
    } 

    @Override 
    public Class<?> getObjectType(){ 
     return Properties.class; 
    } 

    @Override 
    public boolean isSingleton(){ 
     return false; 
    } 

} 

आप अपने सभी अन्य बीन्स में यह गुण सेम इंजेक्षन सकता है, हालांकि, आपको सावधान रहना होगा करने के लिए हमेशा प्रोटोटाइप दायरे का उपयोग करें। यह सिंगलटन बीन्स, a solution can be found here के अंदर विशेष रूप से मुश्किल है।

public class PropertiesProvider implements ApplicationContextAware{ 

    private String propertyBeanName; 
    private ApplicationContext applicationContext; 

    public void setPropertyBeanName(final String propertyBeanName){ 
     this.propertyBeanName = propertyBeanName; 
    } 

    @Override 
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException{ 
     this.applicationContext = applicationContext; 
    } 

    public String getProperty(final String propertyName){ 
     return ((Properties) applicationContext.getBean(propertyBeanName)).getProperty(propertyName); 
    } 

} 
+0

चाहेंगे नहीं इस भार पूरा आवेदन संदर्भ:

आप हर जगह देखने तरीकों इंजेक्षन नहीं करना चाहते हैं, तो आप भी एक PropertyProvider सेम इस तरह इंजेक्षन सकता है? क्या आप कुछ नमूना साझा कर सकते हैं? मैं वसंत के लिए बहुत नया हूँ इसलिए मैं गलत हो सकता हूं। मैंने पूरे वसंत अनुप्रयोग संदर्भ को पुनः लोड करने के बारे में भी सोचा, लेकिन इसका मतलब यह होगा कि, वर्तमान में चल रही अन्य प्रक्रियाओं को बाधित किया जा सकता है। या शायद मैं गलत सोच रहा हूँ! – SJoe

+0

नहीं, आप सही हैं, पूरा संदर्भ ताज़ा किया जाएगा। –

+0

उस स्थिति में मेरी वर्तमान में चल रही प्रक्रिया बाधित नहीं होगी। मेरा बैच एप्लिकेशन है और प्रक्रिया को पूरा करने में घंटों लग सकते हैं। इसके अतिरिक्त, मेरे पास वसंत के माध्यम से एक कॉन्फ़िगर किए गए शेड्यूलर फैक्ट्रीबीन है। मेरा सवाल है, अगर मैं पूरी तरह से एप्लिकेशन संदर्भ पुनः लोड करता हूं, तो शेड्यूलर रीसेट नहीं होगा? – SJoe

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