Lorsque vous êtes amenés à développer des traitements qui s’exécutent en permanence de manière récurrente, préférez un appel récursif à un appel cyclique de vos scénarios.
Explications …
Imaginons que l’on souhaite scruter l’arrivée de fichiers dans un répertoire. Dans ce cas il y a principalement 2 façons de faire :
- 1ère solution : on crée un unique package qui boucle sur un OdiFileWait.
- 2ème solution : on crée un package qui appelle un OdiFileWait, et une fois que celui-ci est terminé, on fait un appel récursif au package actuel. Ainsi une nouvelle session est créée et la session actuelle sera terminée.
Attention : pour cela il faut absolument lancer l’appel récursif en mode Asynchrone.
Explications :La 2ème solution est préférable pour au moins une seule et bonne raison : pour chaque appel récursif de votre package, une nouvelle session sera créée, et ainsi au niveau des logs du module Operator, une session sera créé et fera son apparition en tête des logs, ce qui permettra de voir qu’un traitement vient de se relancer.
A contrario, la 1ère solution ne fera apparaître dans les logs une seule et unique session qui se perdra dans le passé des traces de l’Operator, d’autant plus si régulièrement vous purgez vos logs.
Par ailleurs, si vous constatez un comportement étrange de vos traitements (erreurs sur tentatives de lectures d’un fichier inexistant, ou fichier verrouillé par un autre processus, etc.), il sera plus simple de voir les traitements en cours d’exécution puisque justement un traitement lancé récemment apparaîtra dans les traces récentes du journal et ne sera à priori pas encore purgé.
Enfin, si vous utilisez le Load Balancing, la solution de l’appel récursif permettra, lors de la création d’une nouvelle session, d’éventuellement basculer sur un autre agent moins surchargé s’il en existe un.