2010-11-03 9 views
5

Bir özellik dosyanız var ve Spring özellik yer tutucusunu kullanıyorum, değerleri Spring beans'e ayarlıyorum. Şimdi, bu özellik dosyası çalışma süresi boyunca değiştirilebilir. Bu yeni değiştirilmiş mülk değeri ile Bahar fasulyelerinin özelliklerini yenilemenin bir yolu var mı? Özellikle birçok tek fasulye var mı? Onları yeni değerlerle nasıl yenileyebilirim? Bunun için zaten bir çözüm var mı yoksa özel kodlanmış mı? Zaten mevcut değilse, biri bunu başarmak için en iyi yaklaşımı verebilir mi? Teşekkürler!Spring - Yeni özellik dosyası ile fason özellik değerlerini değiştirme

Not: Uygulamam bir toplu iş uygulamasıdır. Grupları zamanlamak için yay tabanlı kuvars konfigürasyonu kullanıyorum.

cevap

3

ben referans için bu bırakacağım ama güncellenmiş cevap bölücü aşağıdaki gibidir:

Eh ConfigurableApplicationContext arayüzü istediğini olması gereken bir refresh() yöntemi içerir, ancak soru şu: nasıl erişmek için bu yöntem. Ya

  1. Task Execution Framework kullanmak

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

    Şimdi öneririm iki temel seçenek olacaktır: Eğer bunu Hangi yolu, tip ConfigurableApplicationContext bir bağımlılık olan bir fasulye ile başlayacağız Fasulyeinizin düzenli olarak mülk kaynaklarını izleyebilmesini sağlayın, değişiklikleri bulduğunda ApplicationContext'i veya expose the bean to JMX'u yenileyin, yenilemeyi manuel olarak tetiklemenizi sağlayın.


yorumlarla değinen: Bu metnin bütününü yenilemek için imkansız gibi çünkü alternatif bir strateji özellikler fabrika fasulye oluşturmak ve diğer tüm fasulye içine enjekte etmek olacaktır.

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

} 

Hep prototip kapsamını kullanmak ancak, dikkatli olmak gerekir, diğer tüm fasulye içine bu özellikler fasulye enjekte edebilir. Bu, tekli fasulye, a solution can be found here içinde özellikle zor.

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

olmaz mıydı bu yük tüm uygulama bağlamı: biryere arama yöntemleri enjekte etmek istemiyorsanız

, ayrıca böyle bir PropertyProvider fasulye enjekte edebilir? Biraz örnek paylaşır mısın? İlkbahar'a yeni geldim, bu yüzden yanılıyor olabilirim. Ayrıca tüm bahar uygulama içeriğini yeniden yüklemeyi düşündüm, ancak bu şu anda çalışan diğer süreçlerin kesintiye uğraması anlamına geliyordu. Ya da belki yanlış düşünüyorum! – SJoe

+0

Hayır, haklısınız, tam bağlam yenilenir. –

+0

Bu durumda, şu anda çalışan işlemimin kesintiye uğraması gerekmez. Benimki bir parti uygulamasıdır ve bir sürecin tamamlanması saatler sürebilir. Ayrıca, ilkbahar boyunca yapılandırılmış bir SchedularFactoryBean var. Sorum şu ki, Uygulama Bağlamını tamamen yeniden yüklersem, programlayıcı sıfırlanamaz mı? – SJoe