2016-06-27 5 views
0

Ich habe die Eigenschaften aus einer Tabelle in der Datenbank lesen konnte, wie es Reading mule config from databaseLesen Sie Eigenschaften aus der Datenbank und verwenden Sie es statt mule-app.properties

Jetzt hier beschrieben wurde, bin ich nicht in der Lage diese anwenden Eigenschaften für die Ablaufkonfigurationen und greifen Sie außerdem über die MuleEventContext-Nachricht in den Java-Prozessorklassen auf die Eigenschaften für ausgehende Elemente zu.

Update: unten ist mein Flow XML-Code

<flow name="push-data"> 
    <poll doc:name="Push Poll"> 
     <fixed-frequency-scheduler frequency="${push.data.poll.frequency}" timeUnit="MINUTES" /> 
    <set-property propertyName="tempFilePath" value="${temp.csv.file.path}" doc:name="Property"/> 

    <component class="com.reports.processors.PushDataProcessor" doc:name="PushDataProcessor"/> 
    <logger message="worked!!!" level="INFO" doc:name="Logger"/> 
    <exception-strategy ref="push-report-data_Catch_Exception_Strategy" doc:name="Reference Exception Strategy"/> 
</flow> 

Ich versuche, die Eigenschaften "push.data.poll.frequency" und "temp.csv.file.path" einzustellen. Zuvor befanden sich diese Eigenschaften in der Datei "mule-app.properties".

Also, meine Frage ist, Wie stelle ich die Eigenschaften aus der Datenbank in den Fluss geladen. Bitte beachten Sie, dass ich die Eigenschaften bereits aus der Datenbank geladen habe, wie im obigen Link beschrieben. Ich möchte nur diese Eigenschaften in den Fluss setzen können, anstatt sie aus der mule-app.properties zu nehmen.

BEARBEITEN: Um weitere Informationen hinzuzufügen, Ich verwende eine Klasse mit @Configuration Annotation. Die Klasse, wie im obigen Link beschrieben, lädt die Eigenschaften aus der Datenbank. Unten ist der Quellcode.

@Configuration(name="databasePropertiesProvider") 
@Component 
public class DatabasePropertiesProvider { 

@Autowired(required=true) 
private MyService myService; 

@Bean 
public Properties getProperties() throws Exception { 
    Properties properties = new Properties(); 
    // get properties from the database 
    Map<String,String> propertiesMap = myService.getMuleAppPropertiesFromDB(); 
    if(null != propertiesMap && !CollectionUtils.isEmpty(propertiesMap)) 
     properties.putAll(propertiesMap); 
    return properties; 
} 

@Bean 
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() { 
    return new PropertySourcesPlaceholderConfigurer(); 
}} 

Diese Klasse wird jedoch ausgeführt, nachdem die App initialisiert wurde. Zuvor hatte ich den PropertySourcesPlaceholderConfigurer in der XML-Konfiguration mit der Factory-Bean als DatabasePropertiesProvider-Klasse konfiguriert. Aber da DatabasePropertiesProvider eine Abhängigkeit von der MyService-Klasse hat und die Abhängigkeit nicht aufgelöst wurde, weil die MyService-Bean nicht im Container vor der Eigenschaftskonfiguration initialisiert wurde, musste ich einige Änderungen an DatabasePropertiesProvider (der obigen Version) vornehmen, damit diese nach dem Ausführen ausgeführt wird App-Initialisierung.

Aber jetzt ist das Problem, dass ich nicht auf die Eigenschaften zugreifen kann, die aus der Datenbank geladen werden.

UPDATE 2: Ich fand eine Lösung. Anscheinend habe ich versucht, den @ Service MyService in der databasePropertiesProvider-Klasse automatisch zu starten. Das Autowiren hat mit Null fehlgeschlagen, aufgrund dessen habe ich weitere Änderungen an der DatenbankpropertiesProvider-Klasse vorgenommen, sodass es nach der Initialisierung der App ausgeführt wird.

Wenn ich es jetzt ansehe, merke ich, dass ich nicht über alle Service- und Repository-Ebenen eine Verbindung zur Datenbank herstellen muss. Ich habe den Abfrageausführungscode aus der Repository-Klasse in die databasePropertiesProvider-Klasse verschoben, und jetzt werden die Eigenschaften während der Initialisierungszeit geladen, und die Flüsse können die Eigenschaften abrufen, ohne Änderungen vorzunehmen.

Vielen Dank für Ihre Hilfe Jungs. Hat mich dazu gebracht, viel nachzudenken.

Grüße, Zulfiqar

+0

Können Sie zeigen, wie Sie versuchen, auf diese Eigenschaften zuzugreifen –

+0

Die Eigenschaften sollten bei init geladen werden. Und dann zugänglich mit $ Platzhalter. Können Sie zeigen, wie Sie versuchen, auf sie zuzugreifen? –

+0

Danke @Satheesh und @Ryan !! Ich habe die Frage aktualisiert. Bitte helfen Sie !! –

Antwort

1

fand ich eine Lösung. Anscheinend habe ich versucht, den @ Service MyService in der databasePropertiesProvider-Klasse automatisch zu starten. Das Autowiren hat mit Null fehlgeschlagen, aufgrund dessen habe ich weitere Änderungen an der DatenbankpropertiesProvider-Klasse vorgenommen, sodass es nach der Initialisierung der App ausgeführt wird.

Wenn ich es jetzt ansehe, merke ich, dass ich nicht über alle Service- und Repository-Ebenen eine Verbindung zur Datenbank herstellen muss.Ich habe den Abfrageausführungscode aus der Repository-Klasse in die databasePropertiesProvider-Klasse verschoben, und jetzt werden die Eigenschaften während der Initialisierungszeit geladen, und die Flüsse können die Eigenschaften abrufen, ohne Änderungen vorzunehmen.

Der gesamte Code sieht wie folgt aus XML Config: -

<bean class="net.intigral.reports.provider.properties.DatabasePropertiesProvider" id="databasePropertiesProvider"> 
    <property name="entityManager" ref="entityManager" /> 
</bean> 

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="properties"> 
     <bean factory-bean="databasePropertiesProvider" factory-method="getProperties" /> 
    </property> 
</bean> 

Java-Code: -

public class DatabasePropertiesProvider { 

EntityManager entityManager; 

public Properties getProperties() throws Exception { 
    Properties properties = new Properties(); 

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

public EntityManager getEntityManager() { 
    return entityManager; 
} 

public void setEntityManager(EntityManager entityManager) { 
    this.entityManager = entityManager; 
} 

@SuppressWarnings("unchecked") 
private Map<String,String> getMuleAppPropertiesFromDB() { 
    Map<String,String> collect = null; 
    String query = "select key, value from MuleAppProps muleAppProps"; 
    List<Object[]> results = entityManager.createQuery(query).getResultList(); 
    if (CollectionUtilsIntg.isNotEmpty(results)) { 
      collect = results.stream().collect(Collectors.toMap(o -> (String)o[0], o -> (String)o[1])); 
    } 
    return collect; 
}} 

Nun, ich bin in der Lage, die Eigenschaften auf die gleiche Weise ich von laden verwendet laden mule-app.properties in den FLOWs.

Verwandte Themen