Mon scénario de traitement de fichier est,
read input file -> process -> generated output file
4 Réponses :
Il y a un moyen assez simple de le faire. Si je vous approprète, vous mettez tous les familles dans la base de données (certaines des infos à ce sujet), puis supprimez pour créer une nouvelle sortie. Vous pouvez verrouiller () dessus,
Avant de lire le fichier u check et dans le processus p> voici quelques informations sur LOCK . P> P>
Ce verrouillage fonctionnera-t-il si deux JVM sont impliqués? Parce qu'il y a deux machines différentes sont impliquées qui ne sont pas connectées.
Vous pouvez planifier un travail par fichier d'entrée (l'emplacement du fichier d'entrée serait un paramètre du travail). Le lot de printemps garantira que deux instances de travail avec les mêmes paramètres de travail sont créés. Vous obtiendrez un jobexecutionAlreadyRunningException code> ou
jobinsttanceAreadyCompleteException code> Si l'autre nœud a déjà commencé à traiter le même fichier. P>
C'est la solution pour le problème de lots plutôt classique ouvert ici.
Vais-je obtenir JobexCutionAlreadyRunningException Cette exception si des emplois sont à partir de deux machines différentes? Parce que mon oreille d'application sera déployée sur ces deux machines qui déclenchent ces emplois.
La première chose à faire serait de décider si vous souhaitez réellement diviser les fichiers en deux (5 et 5), ou souhaitez-vous que chaque traitement du serveur jusqu'à ce qu'il soit fait? Si les fichiers sont différentes tailles avec quelques petites et d'autres plus grandes, vous risquez de vous retrouver avec une parallélisation optimale ayant 6 traitées sur un serveur et 4 de l'autre, ou 7 et 3, si les 3 prennent aussi longtemps que l'autre 7 à cause des différences en taille. p>
Un moyen très rudimentaire serait d'avoir une table de base de données pouvant représenter un traitement actif. Votre travail pourrait lire le répertoire, saisir le premier nom de fichier, puis insérer dans la table qu'elle a été traitée par cette JVM. Si la clé principale de la table est le nom de fichier, alors s'ils essaient tous les deux en même temps, on échouerait et on réussirait. Celui qui réussit à insérer l'entrée dans la table gagne et à traiter le fichier. L'autre doit gérer cette exception, choisir le fichier suivant et tenter de l'insérer comme une entrée de traitement. De cette façon, chacun établit essentiellement une serrure centralisée (dans la table de base de données) et vous obtenez un traitement plus efficace qui considère la taille du fichier plutôt que même la distribution de fichiers. P>
Voici mes suggestions: P>
Créez une table de verrouillage dans dB avec le chemin de fichier comme clé primaire. Ensuite, essayez d'insérer un enregistrement avec cette touche - si vous réussissez, votre code peut continuer et traiter le fichier, le cas échéant (exception, qui enregistre avec cette clé primaire existe), puis passez au fichier suivant. P> LI>
planification précise, comme mentionné précédemment par Jimmy P> Li>
Vous pouvez essayer d'utiliser une file d'attente (comme Activemq, RabittMQ, ...) pour synchroniser vos machines P> LI> ul>
Fichier de sortie généré = Écrivez le résultat dans la base de données?, ou la base de données est utilisée uniquement pour les métadonnées de lots de printemps? Et vous rédigez réellement des fichiers de sortie dans votre boîte de fichiers?
Oui, je dois générer un fichier de vente sur le système de fichiers, DB permet de stocker les détails du fichier d'entrée et après le traitement de ces détails, je dois générer un fichier de vente.
S'il n'y a pas de dépendances entre vos fichiers, je ne vois pas pourquoi vous ne pouviez pas faire cela. La seule chose que vous devez vérifier est d'éviter de traiter le même fichier dans les deux emplois !! Mais ce serait la responsabilité de l'appelant ... Comment commencez-vous vos emplois? Calendrier? un ksh?
Oui, c'est la principale préoccupation qui évite de traiter le même fichier sur le serveur et que nous prévoyons d'utiliser la planification pour déclencher des travaux après 20 minutes, mais ce scéduleur sera sur le serveur d'applications afin d'éviter le même traitement de fichier sur le serveur? Utilisation de la colonne DB Flag ou y a-t-il une approche plus propre?
Salut. Avez-vous trouvé une solution pour cela?
Comme le répondit Jimmy Praet, si le chemin de fichier est unique et que vous l'utilisez comme paramètre de travail, Spring Lot prendra soin de ne pas exécuter un travail deux fois. Ceci est la solution propre à suivre, car vous ne vous souciez plus de ce que serveur exécute le fichier.
Oui Le chemin de fichier est unique, mais j'ai deux oreilles d'application (qui sont identiques) fonctionnant sur deux machines différentes qui déclenchent ces travaux, donc je suppose que je aurai encore besoin d'un mécanisme de verrouillage.