Lorsqu’une application met à disposition un fichier contenant des données sur un serveur FTP, ces données peuvent être perdues si la récupération se fait pendant que le fichier est en cours d’écriture par l’application émettrice. Cet article présente une solution qui permet d’assurer avec Stambia un transfert de fichier correct sans perte de données.
Note : Pour chaque processus présenté, le projet est fourni dans l’archive zip disponible ci-dessous et importable dans Stambia. Le nom des différents process est indiqué sous chaque capture d’écran.
Stambia propose un composant « FtpGet » qui permet de récupérer facilement des fichiers de différents formats à partir d’un serveur FTP. Toutefois, ce transfert peut présenter une anomalie lorsque le transfert FTP se fait durant de l’écriture du fichier côté serveur. Dans ce cas, le fichier récupéré sera incomplet ou de taille 0 octets.
Dans cet article, nous allons présenter un processus Stambia qui permet de résoudre ce problème à travers un cas concret, le principe de ce processus est le suivant :
- Récupérer les fichiers sur le serveur FTP et les stocker dans un dossier temporaire sans supprimer les fichiers originaux.
- Stocker les informations des fichiers (nom, taille) dans une table de base de données.
- Après une temporisation de trois minutes, le process sera lancé une nouvelle fois.
- Récupérer de nouveau les fichiers à partir du serveur FTP et les stocker dans un dossier temporaire.
Pour chaque fichier, on va tester si la taille du fichier reste la même après les trois minutes. Si c’est le cas alors l’écriture du fichier est bien terminée et on peut déplacer le fichier vers un dossier final. Si la taille du fichier est différente de la taille stockée dans la base de données, alors le fichier peut être en cours d’écriture. Le fichier ne sera pas déplacé, le processus mettra à jour les informations du fichier dans la base de données avec la nouvelle taille.
Métadonnées
Pour mettre en place ce processus Stambia, il va falloir définir les métadonnées du serveur FTP. Dans le cadre de cet article, nous allons utiliser un serveur créé par l’outil FileZilla.
Pour stocker les informations des fichiers, nous allons créer une table appelée « files » sous une base de données MySQL. Le script de création de cette table est le suivant :
CREATE TABLE `files` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(500) NOT NULL, `download_date` datetime DEFAULT NULL, `size` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=latin1
Les métadonnées de la table « files » seront définies comme suit :
Process Stambia
Après avoir déclaré les métadonnées, nous pouvons maintenant procéder à la création du process Stambia. Le processus « getFilesFromFTP » est défini de la façon suivante :
Dans ce process, on définit trois paramètres :
- FTP_remote_path : doit contenir le chemin du dossier qui contient les fichiers à récupérer sur le serveur FTP.
- Temp_local_path : doit contenir le chemin du dossier local dans lequel seront stockés temporairement les fichiers récupérés.
- Final_local_path : doit contenir le chemin du dossier local dans lequel seront stockés les fichiers à la fin du process.
Dans un premier temps, le composant « FtpGet » récupère tous les fichiers sur le serveur FTP sans les supprimer (le paramètre DELETE_FILE_AFTER_TRANSFERT est à false), et les place dans le dossier temporaire « 01 – Temp ».
Ensuite, le composant « FileWait » permet d’avoir la liste des fichiers du dossier temporaire, et en utilisant un lien ‘Bind’, le sous-process « IUFileData » sera appliqué à chacun des fichiers.
Le sous processus « IUFileData » se présente comme suit :
Le paramètre ${~/exist} stocke le résultat de la requête suivante :
SELECT case when count(*)>0 then true else false end as exist FROM files WHERE name="${../file_name}$"
Ce paramètre de type booléen prend la valeur false lorsque le fichier n’existe pas dans la table « files », c’est-à-dire que c’est la première fois que ce fichier passe par le processus. Dans ce cas-là, on insère les informations de ce fichier dans la base de données à l’aide du composant « Insert file data ».
Si le fichier existe déjà dans la table « files » (le paramètre ${~/exist}$ prend la valeur true), on récupère la taille du fichier enregistré pendant la première itération et on la compare à la taille actuelle du fichier.
Si ces deux tailles sont différentes, on met à jour les informations du fichier dans la base de données avec la nouvelle taille. Si les deux taille sont identiques (cela veut dire que le fichier n’a pas changé entre les deux itérations) alors on exécute le sous-process « get&Deletefile ».
Le sous process « get&DeleteFile » est illustré dans la figure suivante :
Il permet de récupérer et supprimer le fichier sur le serveur FTP. Le fichier récupéré sera stocké dans le dossier « 02 – Final ». Puis il supprime les informations du fichier dans la table « files » et enfin il supprime le fichier du dossier « 01 – Temp ».
Ce process permet de récupérer des fichiers sur un serveur FTP tout en restant sûr que l’écriture du fichier est bien terminée. Pour automatiser ce process il suffit ensuite de programmer l’exécution répétitive du delivery correspondant (toutes les trois minutes par exemple) dans le portail Stambia Analytics.