Scripting pour Oracle Service Bus : Le split de fichier

 
 
 
 
 

On ne le répétera jamais assez :
« Oracle Service Bus (OSB) n’est pas destiné à transporter des charges massives de données. »
N.B : La solution Oracle adéquate étant l’Oracle Data Integrator (ODI)

 
 
 
 
 
Ici, nous allons nous focaliser sur des données provenant de fichiers intégrés par le biais d’un connecteur « Java Connector Architecture » (JCA).
Ce connecteur ne fait pas défaut au principe de l’OSB. Il traite facilement les fichiers de petites tailles (inférieurs à 10 Mo) mais son fonctionnement peut être perturber au-delà :

<BEA-000000> <Generic Error caught while translating inbound file in streaming mode :
file_name.xml
java.lang.NullPointerException
at oracle.tip.adapter.file.inbound.InboundTranslatorDelegate.xlate(InboundTranslatorDelegate.java:295)
at oracle.tip.adapter.file.inbound.InboundTranslatorDelegate.doXlate(InboundTranslatorDelegate.java:121)
at oracle.tip.adapter.file.inbound.ProcessorDelegate.doXlate(ProcessorDelegate.java:408)
at oracle.tip.adapter.file.inbound.ProcessorDelegate.process(ProcessorDelegate.java:177)
at oracle.tip.adapter.file.inbound.ProcessWork.run(ProcessWork.java:349)
at weblogic.work.ContextWrap.run(ContextWrap.java:41)
at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:545)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

C’est donc entre NullPointerException déroutant, contraintes de productivité projet significatives et/ou optimisations techniques que je vous propose une solution de scripting, en 3 étapes, pour rester sur nos bons rails OSB.

I –  Mise en place d’un script « sh »



Script à déposer dans un répertoire sur même machine que les fichiers à scanner.
L’ensemble des fichiers découpés sera déplacé dans le répertoire « split ». Les fichiers originaux, une fois analysés pour éventuelle découpe, sont ensuite déplacés dans un répertoire « archive ».

#!/bin/sh
# Init
input=${1%/}"/"
splitpath=${input%/}"/../split/"
temppath=${input%/}"/../temp/"
errorpath=${input%/}"/../error/"
archivepath=${input%/}"/../archive/"
split(){
    # Create temp file from input file
	file=$1
	name="${file##*/}"
	tempfile=$temppath/$name
	cp $file $tempfile
	# split body into parts
	./SplitFiles.awk $tempfile
	rm $tempfile
	# move temp files to split
	filesToMove=`find $temppath/* 2>/dev/null`
	for file in $filesToMove
	do
		fileNameToMove="${file##*/}"
		to="$splitpath/$fileNameToMove"
		echo "INFO : move file from $from to $to"
		mv $file $to
	done
	# archive unsplitted file
	mv $1 $archivepath
}
filesInDirectory=`ls -A $input`
if [ ! -z "$filesInDirectory" ]; then
	for file in $(find $input/*)
	do
		split $file
	done
fi

 

II –  Mise en place d’un script « awk »

En complément du script sh, on utilisera un script awk connu pour son efficacité de traitement de lignes d’un fichier. Via ce script, on va choisir la valeur de la taille maximale suivant laquelle notre « gros » fichier devra être découpé (ici toutes les 2000 lignes). Chaque fichier ainsi découpé, en plusieurs, se retrouvera suffixé d’un numéro d’identification. Ce script est à déposer dans le même répertoire que le script sh précédent.

#!/bin/awk -f
# Arbitrary choice of size file in 2000 lines
BEGIN {
	nbFiles = 0;
	nbLines = 2000;
}
/^/{
	if(nbLines >= 2000){
		closeFile();
		openFile();
	}
	print > file;
	nbLines ++;
}
END {
	closeFile();
	print nbFiles " files created";
}
function openFile() {
	nbFiles ++;
	nbLines = 0;
	file = "";
	#  Put suffixe number to filename of split file
	if(match(FILENAME, /\.[^.]*$/)){
		file = substr(FILENAME, 0, RSTART-1) "-" nbFiles substr(FILENAME, RSTART, RLENGTH);
	} else {
		file = FILENAME "-" nbFiles;
	}
}
function closeFile() {
	close(file);
}


III – Ajout d’une « crontab »

Sur le serveur Linux, via la commande « crontab -e », ajouter les chemins absolus du script SplitFiles.sh et de son répertoire input devant être contrôlé :
Exemple :

*/5 * * * * cd /home/weblogic/split; ./SplitFiles.sh /input/

IV – Conclusion

Ces trois étapes mises en place, il ne reste plus qu’à faire pointer l’OSB vers le répertoire split. Le contrôle de fichiers volumineux pour découpage sera donc complètement opérationnel.
Pour aller plus loin, suivant les logiques métiers qui décrivent le fichier, il est également possible de diviser le fichier en bloc métier indivisible plutôt que par taille arbitraire, ou encore de rajouter un certain nombre de contrôle d’intégrité métier du fichier avant de le traiter… mais ceci sera plutôt l’objet d’un autre article.