2016-06-29 9 views
0

Es ist mir gelungen, die Eigenschaften der mule-Anwendung aus der Datenbank bei app init zu laden und sie auf die Eigenschaft placeholders von mule flows zu setzen. Auf den Code dafür wird hier verwiesen Read mule props from the DBEigenschaften von java.util.Properties-Objekt auf Platzhalter für Mule-Flow-Eigenschaften zur Laufzeit setzen

Dies funktioniert jedoch nur während App-Start. Ich möchte in der Lage sein, die Eigenschaften in der Datenbank zu ändern (was ich kann) und es zur Laufzeit über die Mule-Flows reflektieren zu lassen, ohne den Mule-Server neu zu starten.

Um dies zu erreichen, habe ich einen neuen Fluss mit einem Http-Listener erstellt, der eine Java-Klasse aufruft, die die Eigenschaften aus der Datenbank liest und versucht, sie mithilfe der PropertySourcesPlaceHolderConfigurer-Klasse auf Bean-Factory zu setzen. Der Beispielcode der Java-Klasse sieht so aus.

@Autowired 
ConfigurableListableBeanFactory configurableListableBeanFactory; 

@Autowired 
MyService myService; 

public MuleEventContext onCall(MuleEventContext eventContext){ 
Properties properties = new Properties(); 

    // get properties from the database 
    Map<String,String> propertiesMap = getMuleAppPropertiesFromDB(); 
    if(null != propertiesMap && !CollectionUtilsIntg.isEmpty(propertiesMap)) 
     properties.putAll(propertiesMap); 

PropertySourcesPlaceholderConfigurer cfg = new PropertySourcesPlaceholderConfigurer(); 
cfg.setProperties(properties); 
cfg.postProcessBeanFactory(configurableListableBeanFactory); 
} 

Dieser Code wurde erfolgreich ausgeführt, konnte jedoch die Eigenschaften nicht für die Laufzeit der Mule-App-Flüsse festlegen.

Hat jemand eine Idee, wie sonst kann das erreicht werden?

Bitte helfen

Antwort

1

ich PropertyPlaceholders Leben glauben, sobald ist beendet als Anwendung vollständig heißt beginnt sie zu Anwendung init begrenzt sind und während Bohnen Schöpfung nur. Wenn Sie Eigenschaften in der Lage sein wollen, zur Laufzeit ändern, dann sollten Sie nicht Eigenschaft Platzhalter verwenden, aber andere Eigenschaften Mechanismen verwenden, wie die Schaffung einer Bohne von org.springframework.beans.factory.config.PropertiesFactoryBean

<?xml version="1.0" encoding="UTF-8"?> 
<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd 
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd"> 

    <http:listener-config doc:name="HTTP Listener Configuration" host="0.0.0.0" name="HTTP_Listener_Configuration" port="8081"/> 
    <spring:beans> 
     <spring:bean id="myProps" name="myProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
      <spring:property name="properties"> 
       <bean factory-bean="databasePropertiesProvider" factory-method="getProperties" />  
      </spring:property> 
     </spring:bean> 
    </spring:beans> 
    <flow name="test"> 
     <http:listener config-ref="HTTP_Listener_Configuration" doc:name="Recieve HTTP request" path="/test"/> 
     <logger message="#[app.registry.myProps['testPropertyName']]" /> 
    </flow> 
</mule> 

Statt aus einer Datei zu lesen, können Sie von db laden . Dann benutze diese in deiner Maultierkonfiguration als # [app.registry.myPropes ['mykey']]. Lesen Sie über MEL-Kontextobjekte here.

Im obigen Beispielcode registrierte ich myPoros Bean und geladene Eigenschaften aus der Datenbank. app.registry ist Application Registry Context-Objekt in Mule verfügbar, es gibt Ihnen Zugriff auf Frühjahr Bohnen.

+0

Danke für die Antwort @ manik-magar. Wie sollte ich die PropertiesFactoryBean verwenden, um die aus der Datenbank geladenen Eigenschaften festzulegen? Ich habe ein java.util.Properties-Objekt, wie ich in der obigen Frage gezeigt habe. Und was ist app.registry? Muss ich das Properties-Objekt für die Registrierung festlegen? Wenn ja, wie? Bitte helfen Sie !! –

+0

Ich aktualisierte die Antwort, um den Beispielcode anzuzeigen. Denken Sie daran, dass dies nicht 100% Ersatz für den Eigenschaftenkonfigurator sein kann, insbesondere für Eigenschaften, die Beans definieren. Beispiel: Host im HTTP-Listener oder Pfad im eingehenden Dateiendpunkt. Diese Eigenschaften werden bei der Bean-Erstellung gelesen, und Änderungen an der Quelle werden nicht reflektiert, es sei denn, Ihre Neustart-App (deshalb funktionierten Ihre Änderungen nur für den Start der App). –

+0

Danke für die Antwort und eine ziemlich gute Erklärung @ manik-magar !!!. Ich werde es ausprobieren und sehen, ob es für mich funktioniert. Ich werde aktualisieren, wie es geht. Grüße !! –