2017-06-21 5 views
1

J'ai un Blueprint.xml, et je dois lire les valeurs à partir d'un fichier de configuration externe (dans cet exemple, la valeur de mettre en _from1):Plan lire la valeur du fichier de configuration

.... 

<camelContext id="cbr-example-context" xmlns="http://camel.apache.org/schema/blueprint"> 

     <route id="cbr-route"> 

      <from id="_from1" uri="ftp://[email protected]:21/files?password=pass"/> 


      <to id="_to1" uri="file:c:/TestFTP"/> 

     </route> 
    </camelContext> 
</blueprint> 

Répondre

3

Vous cherchez la property place holder fonctionnalité dans apache camel. Le site d'Apache Camel a beaucoup d'informations sur l'utilisation de cela, mais je vais juste passer par les bases afin que vous puissiez combler les lacunes avec les documents les plus développés. Vous utilisez également un plan qui est différent des anciens emplacements de printemps. Essentiellement, il s'agit d'une syntaxe de type valeur clé avec quelques gotchas à connaître.

1. Format/Syntaxe de la propriété Porteurs blueprint.xml Lieu:

La valeur d'une propriété peut être obtenue en spécifiant son nom clé dans un espace réservé de la propriété en utilisant la syntaxe suivante/format {{key}}.

Par exemple, pour spécifier une adresse de serveur, vous pouvez utiliser {{server.ip}}.

2. Utilisation de la propriété Resolver:

Vous pouvez stocker les valeurs des détenteurs de placer la propriété dans divers endroits ainsi vous devez spécifier comment les résoudre. Cela se fait en utilisant le préfixe PropertyResolver:

Prefix  Description 
    ref:   Lookup in the Registry. 
    file:  Load the from file system. 
    classpath: Load from the classpath(default if no provider specified) 
    blueprint: Use a specific OSGi blueprint placeholder service. 

3. Ajouter l'espace de noms CM au blueprint.xml

Modifier votre XML plan pour inclure l'espace de noms CM.

changer ainsi de:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> 

Pour:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0" 
     xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> 

Quelques exemples et notes:

L'exemple Déclare ci-dessous trois détenteurs de placer la propriété à savoir le nom du serveur de messagerie, le le courrier de et le courrier aux propriétés. Quelques choses à noter que je déclare ceci sans un résolveur de propriété ainsi il le recherchera sur le classpath. Je déploie la plupart de mes routes sur karaf, servicemix donc j'ai créé un fichier company.info.cfg que j'ai placé dans mon dossier karaf/etc. Regardons le plan ci-dessous et voyons comment les choses s'emboîtent. Lisez les commentaires XML.

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd   http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd"> 

<!-- NOTE: The system will look for a file called company.info.cfg in the classpath, this is the value specified by persistent-id="company.info". --> 

<cm:property-placeholder id="placeholder.company.info" persistent-id="company.info" update-strategy="reload"> 
    <cm:default-properties> 
     <cm:property name="company.division.name" value="Foobab"/> 
     <cm:property name="company.division.mail.host" value="foobab-mail-1-server"/> 
     <cm:property name="company.division.mail.to" value="[email protected]"/> 
     <cm:property name="company.division.mail.from" value="[email protected]"/> 
    </cm:default-properties> 
</cm:property-placeholder> 

<camelContext id="rmsConfirmedClosedAccountContext" xmlns="http://camel.apache.org/schema/blueprint"> 
    <endpoint id="smtpFoobabReport" uri="smtp://{{company.division.mail.host}}?to={{company.division.mail.to}}&amp;from={{company.division.mail.from}}&amp;contentType=text/html"/><!-- Here we use a property placeholder For The Mail server--> 

    <route id="timerHelloRoute"> 
     <from id="fromTimerFoobab" uri="timer:Foobab"/> 
     <setHeader headerName="subject" id="setCompanySubjectHeader"> 
      <constant>Foobab reminder for:{{company.division.name}}</constant> <!-- Here we use a property placeholder to set the subject--> 
     </setHeader> 
     <setHeader headerName="body" id="setMailBOdy"> 
      <constant>The company needs to view its foobab report</constant> 
     </setHeader> 
     <to id="toSmtpFoobabReport" ref="smtpFoobabReport"/> 
</camelContext> 

vous remarquerez aussi que j'ai fourni l'espace réservé de la propriété avec des valeurs par défaut. Ceci est très utile pendant le développement et même pendant la phase de démarrage car camel va essayer de trouver le fichier de propriétés et s'il ne peut pas utiliser les valeurs par défaut, vous pouvez pointer vos valeurs par défaut vers le développement et conserver les valeurs de production dans le fichier de configuration de la boîte de dev.

Une dernière chose avant un exemple plus compliqué est le fichier et la balise update_strategy.Un fichier de configuration typique contiendrait la valeur comme ceci:

company.division.name = foobabababa 
company.division.mail.host = production.mail 

Si votre update_strategy est réglé à recharger comme mon exemple, si vous avez changé la valeur du fichier CFG il serait alors recharger les routes qui pointent à cette configuration. Propriétés dynamiques pas besoin d'arrêter et de démarrer vos itinéraires.

Désormais, vous devez parfois avoir plusieurs fichiers de propriétés à utiliser dans un système. Par exemple, un fichier de propriétés d'e-mail et un fichier de propriétés de base de données.

Pour ce faire, vous devez savoir que vous devez modifier la syntaxe/le format de la propriété pour les fichiers de deuxième, troisième etc.

Seul le premier fichier de propriétés peut utiliser {{some.value}}. Cela doit être fait lors de la déclaration des propriétés des détenteurs de place. Voir ci-dessous pour un exemple:

<cm:property-placeholder id="UpdateFilesProperties" persistent-id="maintenance.files.cfg" update-strategy="reload"> 
    <cm:default-properties> 
     <cm:property name="washPool.size" value="1"/> 
     <cm:property name="sifPool.size" value="1"/> 
     <cm:property name="updatePool.size" value="1"/> 
     <cm:property name="etlJobPool.size" value="1"/> 
     <cm:property name="etlSplitPool.size" value="1"/> 
     com.au"/> 
    </cm:default-properties> 
</cm:property-placeholder> 
<cm:property-placeholder id="ccompany.info" persistent-id="info" 
    placeholder-prefix="$([" placeholder-suffix="])" update-strategy="reload"> 
    <cm:default-properties> 
     <!-- properties --> 
    </cm:default-properties> 
</cm:property-placeholder> 

Ainsi, le premier ensemble de propriétés serait l'accès comme {{washPool.size}} mais le deuxième ensemble de propriétés utiliserait la syntaxe spécifiée par ces attributs placeholder-prefix="$([" placeholder-suffix="])"([key.value]) ainsi.

Ils sont incroyablement puissants. Je les ai utilisé pour configurer le nombre de threads sur un itinéraire par exemple ce qui m'a permis d'ajuster la performance basée sur le feedback sans recompiler et redéployer.

+0

Que vous pour la réponse. Me question correcte est, si je déploie cette application dans Apache Fuse, comment modifier dans cette propriété. Merci. –

+0

@ JoseVázquez tu veux dire JBoss Fuse? JBoss Fuse est un servicemix certifié par le chapeau rouge. Il utilise également Apache Karaf. Donc, dans votre chemin d'accès JBOSS Fuse, vous devriez trouver un répertoire etc comme/opt/jboss_fuse/etc. Stockez vos fichiers de configuration ici. Vous pouvez ouvrir les fichiers les éditer et les sauvegarder et Fuse récupérera le changement. – Namphibian

0

vous pouvez utiliser cm: propriété-espace réservé.

S'il vous plaît vérifier L'utilisation d'un .cfg ou fichier .properties Pour Blueprint section de la propriété dans les espaces réservés [1]

Il y a une option mise à jour-stratégie qui peut être réglé pour recharger et les nouvelles propriétés ajoutées ou remplacées reflètera .

[1] http://camel.apache.org/using-propertyplaceholder.html