2012-11-06 14 views
12

Używam pliku właściwości ze sprężyną 3. Kiedy Spring inicjuje swój contex, ładuje plik właściwości i umieszcza go we wszystkich ziarnach z adnotacją @Value.Jak wczytać właściwości za pomocą sprężyny?

Chcę mieć możliwość aktualizacji niektórych właściwości w pliku i udostępnić JMX na serwerze, który przeładuje nowe właściwości na Spring - bez restartowania serwera i przeładowania jego kontekstu.

mogę zaimplementować to za pomocą jakiś sposób Wiosna przeładować właściwości i wypełnić je do wszystkich ziaren, czy powinienem napisać coś takiego przez własną rękę?

Odpowiedz

6

Sugerowałbym zastąpienie java.util.Properties z PropertiesConfiguration z projektu Apache Commons Configuration. Obsługuje automatyczne ponowne ładowanie, wykrywając, kiedy plik się zmienia, lub uruchamiając przez JMX.

+0

to jest ok, ale jak mogę wypełnić wszystkie nowe właściwości do fasoli? Chciałem użyć metody sprężynowej do przeładowania tych właściwości i przejścia przez wszystkie komponenty bean i ustawienia nowych wartości. – Julias

+0

Zakładając, że właściwość 'PropertiesConfiguration' jest właściwością twoich ziaren, nie ma nic do zaludnienia, instancja aktualizuje się sama. –

+0

Powinieneś spojrzeć na http://owner.aeonbits.org/ zamiast PropertiesConfiguration. –

4

Myślę, że nie ma typowego sposobu robienia tego. Najbardziej "czystym" byłoby zamknięcie kontekstu Spring i zbudowanie go od zera. Rozważmy na przykład wykorzystanie puli połączeń DBCP i aktualizację adresu URL połączenia z bazą danych. Oznacza to, że pula musi zostać poprawnie zamknięta, a następnie należy utworzyć nowy obiekt, a następnie wszystkie odniesienia do puli również muszą zostać zaktualizowane. Niektóre komórki mogą pobierać połączenia z tej puli, a aktualizacja konfiguracji puli oznacza, że ​​trzeba jakoś ponownie zażądać połączeń. Zatem fasola może potrzebować wiedzieć, jak to zrobić, co nie jest powszechne.

Proponuję utworzyć osobny komponent bean ze zdarzeniami konfiguracyjnymi i aktualizacyjnymi, a następnie umieścić tę fasolę jako zależność dla wszystkich komponentów bean, które należy znać o zmianach konfiguracji. Następnie możesz użyć Konfiguracji Apache Commons do wczytywania zmian w plikach i propagowania aktualizacji konfiguracji.

Być może używanie JMS jest dobre (jeśli później zamierzasz rozpowszechniać swoją aplikację).

2

Tak, możesz to zrobić na wiosnę w stylu JMX. Dodaj te fasole do twojego wiosennego pliku konfiguracyjnego. Utwórz osobną metodę odczytu pliku właściwości. W tym przykładzie używam metody callThisAgain().

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"> 
    <property name="beans"> 
     <map> 
      <entry key="your.package.bean:name=sampleBeanService" value-ref="sampleService"/> 
     </map> 
    </property> 
    <property name="assembler"> 
     <bean class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler"> 
      <property name="managedMethods"> 
       <value> 
        callThisAgain <!--Simply declare the method name here (only the name) --> 
       </value> 
      </property> 
     </bean> 
    </property> 
</bean> 

<bean class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="rmiRegistry"> 
    <property name="objectName" value="connector:name=rmi"/> 
    <property name="serviceUrl" value="service:jmx:rmi://127.0.0.1/jndi/rmi://127.0.0.1:11000/sample"/> 
</bean> 

<bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean"> 
    <property name="port" value="11000"/> 
</bean> 

Po tym można użyć JConsole aby przeładować metody bez ponownego uruchamiania serwera.

0

użycie Apache Commons ze sprężyną następująco:

@Component 
public class ApplicationProperties { 
    private PropertiesConfiguration configuration; 

    @PostConstruct 
    private void init() { 
     try { 
      String filePath = "/opt/files/myproperties.properties"; 
      System.out.println("Loading the properties file: " + filePath); 
      configuration = new PropertiesConfiguration(filePath); 

      //Create new FileChangedReloadingStrategy to reload the properties file based on the given time interval 
      FileChangedReloadingStrategy fileChangedReloadingStrategy = new FileChangedReloadingStrategy(); 
      fileChangedReloadingStrategy.setRefreshDelay(60*1000); 
      configuration.setReloadingStrategy(fileChangedReloadingStrategy); 
     } catch (ConfigurationException e) { 
      e.printStackTrace(); 
     } 
    } 

    public String getProperty(String key) { 
     return (String) configuration.getProperty(key); 
    } 

    public void setProperty(String key, Object value) { 
     configuration.setProperty(key, value); 
    } 

    public void save() { 
     try { 
      configuration.save(); 
     } catch (ConfigurationException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
0

Apache dostarczyć nam narzędzie do wykorzystania właściwości pliku doładowywalne.

<bean id="propertiesReloadingStrategy" class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy"> 
    <property name="refreshDelay" value="30000" /> <!-- 30 seconds --> 
</bean> 

<bean id="reloadableProperties" class="org.apache.commons.configuration.PropertiesConfiguration"> 
    <constructor-arg value="file:/web/${weblogic.Domain}/${weblogic.Name}/${app.Name}/reloadable_cfg/Reloadable.properties"/> 
    <property name="reloadingStrategy" ref="propertiesReloadingStrategy"/> 
</bean> 
Powiązane problemy