2016-01-27 1 views
0

Je commence tout juste à regarder apache camel (en utilisant des routes blueprint) et je suis déjà coincé.Fichier chameau Apache avec doneFileName

J'ai besoin de traiter un ensemble de fichiers csv avec différents formats. Je reçois 5 fichiers avec foo_X_20160110.csv où X spécifie le type de fichier csv et les fichiers ont un horodatage. Ces fichiers peuvent être assez volumineux et un fichier 'done' est écrit une fois que tous les fichiers sont écrits. Le fichier done est nommé foo_trigger_20160110.csv.

J'ai vu l'option doneFileName sur le fichier, mais qui ne supporte qu'un nom statique (j'ai une date dans le nom de fichier) ou attend un fichier fait pour chaque fichier d'entrée.

Les fichiers doivent être traités dans un ordre fixe, mais il n'est pas garanti dans quel ordre ils sont écrits dans le répertoire d'entrée. Par conséquent, je dois attendre le fichier fait.

Une idée de comment cela peut-il être fait avec Camel?

Des suggestions pour de bons livres de Camel?

+0

Salut, ce étaient plusieurs questions en même temps. Pouvez-vous spécifier plus en détail quelle question vous cherchez? En ce qui concerne les livres, vous devriez commencer avec Camel in Action qui est le livre principal, puis il y a aussi Camel Cookbook. –

+0

Merci pour la recommandation de livre. La question principale était sur comment je peux configurer l'URI de dossier pour employer un dossier fait statique et seulement traiter les autres dossiers dans le répertoire quand ce dossier fait de 0 byte (avec changer le nom basé sur la date) est présent – Ben

Répondre

2

Voici un exemple de la documentation http://camel.apache.org/file2.html

from("file:C:/temp/input.txt?doneFileName=done"); 

Comme vous pouvez le voir le doneFileName a une valeur statique "fait". Mais vous pouvez utiliser java standard pour écrire des noms dynamiques, c'est-à-dire pour le format de date actuel ou quoi que ce soit d'autre, et utiliser simplement l'opération de chaîne pour construire l'URI. J'espère que cela pourra aider.

Mise à jour:

Par ailleurs, comme mentionné dans la documentation il y a la possibilité d'espaces réservés dynamiques pour le doneFileName.

Cependant, il est plus courant d'avoir un fichier par fichier cible. Ce signifie qu'il existe une corrélation 1: 1. Pour ce faire, vous devez utiliser des espaces réservés dynamiques dans l'option doneFileName. Actuellement, Camel prend en charge les suivant deux jetons dynamiques: fichier: nom et fichier: nom.noxt qui doit être être inclus dans $ {}. Le consommateur prend uniquement en charge la partie statique du nom de fichier comme préfixe ou suffixe (pas les deux).

from("file:bar?doneFileName=${file:name}.done"); 

Vous pouvez également utiliser un préfixe pour le fichier fait, comme:

from("file:bar?doneFileName=ready-${file:name}"); 
+0

Merci, peut vous développez sur la façon dont vous appelez Java pour créer le nom dynamique à partir de l'URI du fichier? Désolé encore les premiers jours. Le livre Camel In Action arrive demain – Ben

+0

Je suppose qu'une option serait d'utiliser un processStrategy personnalisé en utilisant un GenericFileProcessStrategy? – Ben

+0

Je ne pense pas que vous ayez besoin de ça. Avec java standard je veux dire, si le fichier done a le nom "currentdate" .txt où currentdate est la date du jour.Ensuite, vous trouvez simplement cela en utilisant java standard et concaténer cela pour créer l'URI. Cela devrait être une façon d'obtenir des noms de fichiers dynamiques. –