2010-12-03 38 views
1

MA SituationComment puis-je créer et écrire un fichier un Java traitement et la lecture d'un autre processus sans faire face à des problèmes de lecture/écriture (Java/EE)

J'ai un processus qui fait FTP et un autre processus qui e-mails.

Alors que j'en ai fini avec le FTP, je veux envoyer une notification de réussite par email. Le processus de courrier électronique recherche un nouveau fichier de configuration de fichier pr à entrer dans un répertoire particulier

Le processus FTP crée un fichier approprié pour le processus de courrier électronique qui correspond plus ou moins à la liste des courriels dans un fichier de propriétés.

Le problème auquel je suis confronté est lorsque je crée le fichier et l'écris. Le processus de courrier électronique qui détecte un nouveau fichier et le lit avant ou pendant l'écriture du fichier. Par conséquent, il accède uniquement aux paramètres null. Bien que je puisse mettre un sommeil sur le processus d'Email, cela ne fonctionnerait pas dans tous les cas et cela gênerait pour d'autres personnes qui ont fini les fichiers.

Que puis-je utiliser pour -créer un fichier de propriétés qui ne peut être lu jusqu'à ce qu'il soit complètement écrit -ou créer un fichier de propriétés avec un verrou qui peut être déverrouillé à partir d'un autre processus au besoin.

Quels sont mes choix?

En ce qui concerne maintenant: - Je l'ai essayé d'utiliser la configuration des communes apache pour SetProperty il a créé la même vieille lecture/problème d'accès en écriture - J'ai créé une propriété = nouvelle propriété et a utilisé la méthode de magasin pour créer le fichier. Même alors le processus de courrier électronique serait lu avant qu'il ne soit complètement

FYI: Email Process avait WatchDirectory et lit chaque fois qu'un nouveau fichier est créé.

Répondre

5

Vous devez effectuer une opération "atomique" en ce qui concerne le système de fichiers. Écrivez le fichier sous un autre nom de fichier (tel que .tmpfoobar) et quand vous avez terminé, fermez-le et faites un File.renameTo() pour le mettre en place. Les renom sont atomiques.

0

Vous ne savez pas pourquoi vous êtes en mode dégradé, car cela semble être une question intéressante. Martin suggère d'utiliser un nom de fichier pour accomplir ceci: d'abord écrire le fichier avec un nom temporaire, puis le renommer. Ensuite, si l'autre processus/thread accède uniquement aux fichiers renommés, alors vous devriez être prêt à partir car les noms re-sont en effet atomiques. Une approche alternative si vous utilisez une application multithread est d'utiliser un mutex de sorte que le thread de lecture ne soit pas lu tant que le fichier n'a pas été fermé par le thread d'écriture.

Cette page et d'autres sur javamex.com ont des explications assez bonnes de programmation Java concurrente:

http://www.javamex.com/tutorials/synchronization_concurrency_1.shtml

+0

été vers le bas ont voté Probablement que les fichiers ne sont pas une bonne façon de communiquer entre les processus. Je suppose que le PO le sait et essaie de trouver la meilleure solution compte tenu des contraintes qu'il a. –