J'ai un fichier JAR Java qui est déclenché par un travail du serveur SQL. Il fonctionne avec succès depuis des mois. Le processus extrait un fichier plat structuré vers une base de données intermédiaire puis pousse ces données dans un fichier XML.Qu'est-ce que je fais à propos d'un programme Java qui a engendré deux instants de lui-même?
Cependant, hier, le processus a été déclenché deux fois en même temps. Je peux dire à partir d'un fichier journal qui est créé, il semble que le processus a couru deux fois simultanément. Cela a causé beaucoup de problèmes et le fichier XML qui a été expulsé était mal formé et contenait des noeuds dupliqués, etc.
Ma question est, est-ce un problème connu avec plusieurs instances de Java JVM générant de lui-même? Ou devrais-je regarder SQL Server comme le coupable? Je suis à la recherche de «verrouillage de socket» ou de verrouillage de fichier pour éviter plusieurs instances dans le futur.
Ceci est la première occurrence de ce problème dont j'ai déjà entendu parler.
Plus d'infos:
Le travail est programmé pour exécuter toutes les minutes. Le travail déclenche un fichier .bat contenant java.exe - jar nom_fichier.jar
Le programme Java s'exécute, analyse un répertoire pour un fichier puis exécute une boucle pour traiter le fichier s'il en trouve un. Après avoir traité le fichier, il exécute une autre boucle qui envoie des messages XML.
Je peux fournir des exemples de code si cela peut aider.
Merci,
Kevin
Voir http://stackoverflow.com/questions/177189/how-to-implement-a-single-instance-java-application – RichardOD
Il semble que la première fois que le processus a duré plus d'une minute, c'est hier. Comme il n'a pas encore fait tout ce qu'il fait pour marquer les données traitées, la seconde instance a commencé une minute plus tard, pensant qu'il y avait du travail à faire. Les solutions de verrouillage proposées ci-dessous devraient vous aider à résoudre le problème de manière permanente. Comme solution temporaire, augmentez le temps entre les tâches à 5 ou 10 minutes. –
Chris, merci pour l'entrée. J'ai cru comprendre avec les travaux Sql-Server qu'il attendra que le travail soit terminé avant de recommencer. Il tourne à 1 minute de l'heure, donc s'il court à 05:01:00 et court jusqu'à 05:02:25, il faudra attendre 05:03:00 pour courir à nouveau. J'ai l'intention de nous faire de l'une des solutions de verrouillage énumérées ici pour résoudre le problème. J'espérais comprendre un peu mieux le problème. J'ai écrit de nombreux processus comme celui-ci, et c'est la première fois que je vois le problème. – kevingreen