Scénario : Diviser un message et renommer les sous-messages selon les informations contenues

Composants Mediation Talend ESB Guide de référence

EnrichVersion
6.1
EnrichProdName
Talend Data Fabric
Talend Real-Time Big Data Platform
Talend MDM Platform
Talend Data Services Platform
Talend ESB
Talend Open Studio for ESB
task
Création et développement
EnrichPlatform
Studio Talend

Dans ce scénario, un message de fichier contenant des informations relatives à des personnes est divisé en sous-messages. Chaque sous-message est renommé selon le nom de la ville qu'il contient et est ensuite routé vers un autre endpoint.

Voici un exemple de fichier XML utilisé dans ce scénario :

<people>
    <person>
        <firstName>Pierre</firstName>
        <lastName>Dubois</lastName>
        <city>Paris</city>
    </person>
    <person>
        <firstName>Nicolas</firstName>
        <lastName>Yang</lastName>
        <city>Beijing</city>
    </person>
    <person>
        <firstName>Ellen</firstName>
        <lastName>Ripley</lastName>
        <city>Washington</city>
    </person>
</people>

Un Bean Java prédéfini, setFileNames, est appelé par le composant cSetHeader utilisé dans ce scénario pour définir un nom de fichier pour chaque message selon le nom de la ville qu'il contient. Pour plus d'informations concernant la création et l'utilisation de Beans Java, consultez le Guide utilisateur du Studio Talend.

package beans;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class setFileNames {
	public String getCityName(Document document) {
		NodeList cities = document.getDocumentElement().getElementsByTagName(
				"city");
		Element city = (Element) cities.item(0);
		String textContent = city.getTextContent();
			return textContent+".xml";
		}
}

Déposer et relier les composants

Ce scénario utilise deux composants cFile, un comme émetteur des messages et un comme récepteur, un cSplitter pour diviser le message source en sous-messages, un cSetHeader pour renommer chaque sous-message et un composant cProcessor pour afficher le nom de fichier de chaque message routé vers le récepteur.

  1. Dans la Palette, développez le dossier Connectivity et déposez deux composants cFile dans l'espace de modélisation graphique.

  2. De la famille Routing, déposez un composant cSplitter dans l'espace de modélisation graphique, entre les deux composants cFile.

  3. De la famille Core, déposez un composant cSetHeader dans l'espace de modélisation graphique, entre le cSplitter et le cFile récepteur.

  4. Cliquez-droit sur le premier cFile, sélectionnez Row > Route dans le menu contextuel et cliquez sur le composant cSplitter.

  5. Cliquez-droit sur le cSplitter, sélectionnez Row > Split dans le menu contextuel et cliquez sur le composant cSetHeader.

  6. Cliquez-droit sur le composant cSetHeader, sélectionnez Row > Route dans le menu contextuel et cliquez sur le second cFile.

  7. Cliquez sur le second composant cFile, sélectionnez Row > Route dans le menu contextuel et cliquez sur le composant cProcessor.

  8. Renommez les composants afin de mieux identifier leur rôle dans la Route, comme ci-dessus.

Configurer les composants et les connexions

  1. Double-cliquez sur le composant cFile nommé Sender pour afficher sa vue Basic settings.

  2. Dans le champ Path, saisissez le chemin d'accès au dossier contenant les fichiers source ou parcourez votre système jusqu'au dossier correspondant.

    Dans la liste Encoding, sélectionnez le type d'encodage de vos fichiers source.

    Dans le champ FileName, saisissez le nom du fichier du message source. Vous pouvez passer cette étape si le dossier source contient un seul fichier.

  3. Répétez les étapes 1et 2 ci-dessus pour définir le chemin d'accès au fichier de sortie ainsi que le type d'encodage dans la vue Basic settings de l'autre composant cFile nommé Receiver. Laissez le champ FileName vide.

  4. Double-cliquez sur le composant cSplitter pour afficher sa vue Basic settings.

    Dans ce scénario, divisez le message en sous-messages à chaque nœud person du fichier XML, Sélectionnez XPath dans la liste Language et saisissez ("/people/person") dans le champ Expression.

  5. Double-cliquez sur le composant cSetHeader nommé Set_file_name pour afficher sa vue Basic settings.

  6. Cliquez sur [+] pour ajouter une ligne au tableau Headers.

    Dans le champ Name, saisissez le nom de l'en-tête que vous souhaitez donner aux messages.

    Définissez le nom de fichier pour chaque message entrant, saisissez "CamelFileName" comme nom de l'en-tête.

    Sélectionnez Bean dans le champ Language et saisissez le nom du Bean Java prédéfini dans le champ Value, beans.setFileNames.class dans ce scénario.

  7. Double-cliquez sur le composant cProcessor pour afficher sa vue Basic settings et personnaliser le code afin que les informations s'affichent comme vous le souhaitez.

    Dans ce scénario, vous souhaitez afficher le nom du fichier de chaque message routé vers l'endpoint récepteur, personnalisez donc le code comme suit :

    System.out.println("File received: "+ 
    exchange.getIn().getHeader("CamelFileName"));
  8. Appuyez sur Ctrl+S pour sauvegarder votre Route.

Visualiser le code et exécuter la Route

  1. Cliquez sur l'onglet Code dans l'espace de modélisation graphique pour visualiser le code généré.

    Comme affiché dans le code, une route de messages est construite d'un (from) endpoint à (.to) un autre et, lors du routage, le message source est divisé selon la condition xpath("/people/person") par le cSplitter_1. Chaque sous-message obtient un en-tête nommé CamelFileName, la valeur retournée par .method(beans.setFileNames.class).

  2. Cliquez sur la vue Run pour l'afficher et cliquez sur le bouton Run pour lancer l'exécution de votre Route. Vous pouvez également appuyer sur F6 pour l'exécuter.

    Résultat : Le message source est divisé en sous-messages. Chaque sous-message est renommé d'après le nom de la ville qu'il contient et routé vers l'endpoint récepteur.