[JAVA] [Apache Camel] Utiliser le composant File

Qu'est-ce que le composant File?

Le composant Fichier est un composant permettant d'accéder au système de fichiers et peut entrer et sortir des fichiers et des répertoires.

Consumer/Producer

Le composant Fichier joue à la fois le rôle de consommateur / producteur. En tant que consommateur, vous pouvez lire des fichiers et des répertoires et déplacer / supprimer des fichiers lus. En tant que producteur, vous pouvez écrire dans des fichiers, etc.

Avec Consumer / Producer, vous pouvez réaliser ce qui suit à titre d'exemple.

Consumer

Producer --Créer un fichier dans le chemin spécifié --Créez un fichier dans le chemin spécifié et créez un fichier avec [nom de fichier] .done lorsque la création est terminée.

URI du composant

L'URI pour utiliser le composant File ressemble à ceci:

file:directoryName

Pour le chemin du contexte (directoryName), spécifiez le répertoire à traiter. Le composant File accède et traite le fichier qui existe dans le directoryName spécifié. Divers traitements peuvent être effectués en spécifiant des options pour ce chemin de contexte. Il existe de nombreuses options pour le composant Fichier, et une description de chaque option peut être trouvée sur le site officiel ci-dessous.

https://github.com/apache/camel/blob/master/components/camel-file/src/main/docs/file-component.adoc#uri-options

Dans cet article également, je voudrais expliquer certaines options avec un exemple de mise en œuvre.

Exemple d'implémentation

Dans cette section, nous montrerons un exemple d'implémentation du composant File en utilisant la racine décrite dans Java DSL. La liste est limitée aux options fréquemment utilisées, et les options répertoriées ne sont qu'un aperçu, veuillez donc vous référer à la description du composant File sur le site officiel ci-dessus pour plus de détails.

Exemple) Copiez les fichiers dans le répertoire spécifié

La racine pour copier les fichiers dans le répertoire spécifié. Copiez tous les fichiers du répertoire data / input dans data / output. En spécifiant l'option noop = true, il sera en lecture seule et les fichiers dans le répertoire data / input ne seront pas déplacés ni supprimés. De plus, la spécification de l'option noop = true activera automatiquement l'option idempotent = true afin que le même fichier ne soit pas traité.

from("file:data/input?noop=true").to("file:data/output");

Exemple) Déplacer les fichiers dans le répertoire spécifié

La racine pour déplacer les fichiers dans le répertoire spécifié. Déplacez tous les fichiers du répertoire data / input vers data / output. delete = true supprimera le fichier après le traitement.

from("file:data/input?delete=true").to("file:data/output");

Exemple) Déplacer récursivement des fichiers dans le répertoire spécifié

Il s'agit de la racine qui déplace de manière récursive les fichiers dans le répertoire spécifié, y compris les fichiers qui existent dans les sous-répertoires. Le sous-répertoire lui-même n'est pas déplacé. Il est spécifié pour traiter récursivement par recursive = true.

from("file:data/input?delete=true&recursive=true").to("file:data/output");

Exemple) Créez un fichier appelé .done une fois le processus terminé.

Il s'agit de la racine qui copie les fichiers dans le répertoire spécifié et crée un fichier appelé [filename] .done une fois le processus terminé. Lorsque tous les fichiers ont été copiés dans le répertoire / data / output, un fichier [filename] .done sera créé dans le répertoire de destination. $ {file: name} représente le nom du fichier en cours de traitement.

from("file:data/input?noop=true").to("file:data/output?doneFileName=${file:name}.done");

Exemple) Si un fichier appelé [nom de fichier] .done existe, déplacez-le.

Au contraire, si le fichier [nom du fichier] .done existe, le fichier sera déplacé.

from("file:data/output?noop=true&doneFileName=${file:name}.done").to("file:data/output.done");

Exemple) Obtenez la liste des noms de fichiers et le contenu du fichier texte.

Lit les fichiers dans le répertoire data / input, récupère la liste des noms de fichiers et le contenu du fichier texte et le produit. Le processeur FileListProcessor est spécifié dans la méthode de processus.

from("file:data/input?noop=true").process(new FileListProcessor());

Le processeur FileListProcessor a le contenu suivant.

FileListProcessor.java


package example.camelbegginer.file;

import java.util.Map;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;

public class FileListProcessor implements Processor {

	@Override
	public void process(Exchange exchange) throws Exception {
		String body = exchange.getIn().getBody(String.class);
		System.out.println("body: " + body);

		Map<String, Object> headers = exchange.getIn().getHeaders();
		System.out.println("fileName: " + headers.get("CamelFileAbsolutePath"));

	}
}

Dans la méthode process, le contenu du fichier est sorti vers la sortie standard avec le code suivant.

		String body = exchange.getIn().getBody(String.class);
		System.out.println("body: " + body);

Les informations de fichier telles que le nom de fichier vont dans l'en-tête du message. L'en-tête du message est acquis comme indiqué ci-dessous, le chemin du fichier est acquis avec "CamelFileAbsolutePath" et il est envoyé vers la sortie standard.

		Map<String, Object> headers = exchange.getIn().getHeaders();
		System.out.println("fileName: " + headers.get("CamelFileAbsolutePath"));

Veuillez vous référer à la page suivante pour la valeur à saisir dans l'en-tête du message. https://github.com/apache/camel/blob/master/components/camel-file/src/main/docs/file-component.adoc#message-headers

En plus du chemin du fichier, vous pouvez obtenir des informations telles que la taille du fichier et la date de dernière modification.

Exemple) Traitez uniquement les fichiers qui incluent la chaîne de caractères spécifiée dans le nom de fichier

Cette route traite uniquement les fichiers qui incluent la chaîne de caractères spécifiée dans le nom de fichier. Utilisez l'option filterFile et écrivez comme suit.

from("file:data/input?noop=true&filterFile=$simple{file:name} contains 'file1'")
						.to("file:data/output");

filterFile=$simple{file:name} contains 'file1'

La valeur de l'option filterFile ci-dessus représente le cas où le nom de fichier contient la chaîne "file1". La valeur de cette option filterFile est spécifiée à l'aide de "Simple Expression Language" et de File Language.

Le langage d'expression simple est le propre langage d'expression d'Apache Camel, qui est utilisé pour afficher les résultats des calculs et des références de valeur, et est écrit comme $ simple {variable}. La plupart des calculs et des références de valeur peuvent être réalisés avec le langage Simple. File Language est une extension du langage d'expression simple qui vous permet de faire référence à des valeurs liées aux fichiers.

"File: name" dans l'exemple précédent représente une référence au nom de fichier dans File Language, et "$ simple {file: name} contient'file1 '" est l'ensemble du langage d'expression Simple et les caractères "file1" dans le nom de fichier. Cela représentera le cas de l'inclusion de colonnes.

Pour plus de détails sur le langage d'expression simple et le langage de fichier, consultez le site Web officiel ci-dessous.

Exemple) Compresser le fichier spécifié en zip

C'est un peu en dehors du composant File, mais pour vous donner une idée de l'utilité d'Apache Camel, parlons de la compression de fichiers en combinaison avec le composant zip. Si vous souhaitez compresser un fichier appelé file1.txt, vous pouvez facilement le faire par la racine suivante.

					from("file:data/input?noop=true&fileName=file1.txt")
						.marshal().zipFile()
						.to("file:data/output");

De plus, pour utiliser le "zipFile ()" ci-dessus, il est nécessaire d'ajouter les dépendances suivantes.

pom.xml


		<dependency>
			<groupId>org.apache.camel</groupId>
			<artifactId>camel-zipfile</artifactId>
			<version>${camel.version}</version>
		</dependency>

référence

Recommended Posts

[Apache Camel] Utiliser le composant File
Utiliser uniquement pour écrire des fichiers - Apache Camel
Quoi de neuf dans Apache Camel 2.19.0
Comment utiliser Apache POI
Apache Camel à l'ère du cloud natif
Modèle de disjoncteur avec Apache Camel