SOA avec Talend ?

Publié le par firesoft.over-blog.com

Contexte :

Transmettre à l'application java, une liste d'événements ayant eu lieu sur différentes tables liées à un objet :

  • les nouveaux contacts
  • les nouvelle photos
  • les nouveaux messages sur le carnet de liaison.

L'application transmettra par mail ces événements aux adresses recoltées.

 

Analyse :

S'agissant d'un job régulier et source de consommation de ressources, décision est prise d'utiliser un job Talend planifié qui "machera" le travail pour l'application. Ce job fournira sous format XML son résultat à l'application via des messages JMS que l'application consommera au fur et à mesure.

 

Mise en application :


Le job principal a la forme suivante :

MainJob.png

Il détecte les événements ayant eu lieu et transmet son résultat (enregistrement par enregistrement) au sous-job tRunJob_1.Quand celui-ci a traité le résultat, il charge la librairie JONAS client pour que le sous job tRunJob_2 traite les fichiers xml générés.

 

1ere étape :

On donne les paramètres au sous job à partir de l'enregistrment courant :

job1.png

A partir des paramètres donnés, 4 requêtes sont effectuées. Le composant tJavaRow_1 permet de transmettre au composant tFileOutputMSXML_1 les paramètres du job.

ConstructXml.png

Le fichier XML est construit à partir de la description suivante

ConstructXml-2.png

Le fichier créé a pour nom un préfixe prédéterminé concaténé à l'id donné en paramètre au job.

 

2eme étape :


le composant tFileList_1 itère sur les fichiers ayant pour nom le préfixe donné d'un répertoire.

sendMessage.png

Le composant tIterateToFlow_1 transforme les résultats de l'itération en flow pour le composant tJavaRow_1.

On récupère ainsi le nom du fichier trouvé qui est stocké dans l'objet row1.

RecupNomFichier.png

  Le composant tJavaRow_1 transmet à la file de messages, le contenu du fichier XML. Le listener n'a plus qu'à traiter ce XML.

 

//Code généré selon le schémas d'entrée et de sortie
output_row.message = new String();
if (input_row.filename == null)
    return;
StringBuilder builder = new StringBuilder();
InputStream ips=new FileInputStream(input_row.filename);
InputStreamReader ipsr=new InputStreamReader(ips);
BufferedReader br=new BufferedReader(ipsr);
String ligne;
while ((ligne=br.readLine())!=null){
    builder.append(ligne);
    builder.append("\n");
}
output_row.message = builder.toString();
br.close();
Properties env = new Properties();
env.put    (Context.INITIAL_CONTEXT_FACTORY,"org.objectweb.carol.jndi.spi.MultiOrbInitialContextFactory");
env.put(Context.PROVIDER_URL, "rmi://localhost:1099");

InitialContext initialContext = new InitialContext(env);

QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory) initialContext.lookup("JQCF");
Queue ringQueue = (Queue) initialContext.lookup("sampleQueue");

QueueConnection queueConnection = queueConnectionFactory.createQueueConnection();
QueueSession queueSession = queueConnection.createQueueSession(
                false,QueueSession.AUTO_ACKNOWLEDGE);
QueueSender queueSender = queueSession.createSender(ringQueue);

TextMessage textMessage = queueSession.createTextMessage();
textMessage.setText(output_row.message);
queueSender.send(textMessage);

queueConnection.close();

 
Problèmes rencontrés :

  • Générer du XML avec Talend, c'est facile quand le schéma est facile. Le composant tFileOutputMSXML est le seul à avoir la capacité de faire du multi-boucle. Par contre, il ne sait que créer le XML dans un fichier. Je pense que ce n'est pas parce qu'on veut faire du XML qu'il doit être forcément stocké en fichier.
  • Lire le contenu d'un fichier à partir de Talend sous-entend qu'on veuille le traiter, ad minima ligne par ligne. Pour du XML, c'est pas terrible.
  • Les composants tJMSOutput et tMOMOutput sont "mariés" à des implémentations de serveur. Quand celui qu'on utilise n'est pas dans la liste, il faut faire du java pur.
  • Les noms des variables utilisées sont celles générées automatiquement. Visuellement, on peut les changer, mais lorsqu'il faut créer son propre code java, il faut utilser les noms génériques.
  • Trop de choses sont écrites en dur (noms de serveur, nom JNDI, etc ...). Je n'ai pas trouver comment avoir un fichier de configuration associée à un job.

Publié dans Talend

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article