2009-10-22 7 views
1

Remarque: J'ai lu d'autres messages sur la façon de verrouiller et déverrouiller un fichier. Je n'ai rien trouvé de spécial dont je n'étais pas au courant. Donc je vais mettre mon scénario ici pour que quelqu'un puisse donner des suggestions. Dans mon expérience, FileChannel.lock ne garantit pas la situation de verrouillage et de déverrouillage d'un fichier lorsque différents objets de plusieurs instances de jvm tentent de verrouiller et de mettre à jour le fichier.verrouillage et mise à jour d'un fichier En conséquence

Le scénario dans ma demande est - il y a trois programmes distincts qui mettent à jour un fichier. Ces programmes sont exécutés sur différentes instances jvm. Supposons que les programmes sont A, B et C, et que le fichier est F. Si A verrouille le fichier F, B et C doivent attendre que F soit relâché avant que l'un des autres programmes ne puisse y accéder. Cela fonctionne correctement si les programmes sont exécutés sur la même instance jvm. Malheureusement, cela ne fonctionne pas dans plusieurs instances jvm.

J'ai eu une autre idée qui était d'avoir un fichier plat où j'indiquer si F devrait être mis à jour. Le contenu de ce fichier plat peut être VERROUILLÉ ou DÉVERROUILLÉ. La valeur par défaut/initial serait UNLOCKED. Ainsi, quand l'un des programmes voudrait mettre à jour F, il doit voir le drapeau dans le fichier plat. Si le drapeau lit LOCKED, il devrait attendre. Dans cette approche, il y a un problème - si plusieurs programmes ouvrent le fichier plat exactement en même temps et voient "UNLOCKED" ou deux programmes qui attendaient le fichier plat pour lire UNLOCKED et exactement en même temps voir le fichier " DÉVERROUILLÉ "?

Une idée les gars?

+1

avez déjà regardé la mise en œuvre de Lucene de org.apache.lucene.store.Lock (par exemple SimpleFSLock et NativeFSLock)? Ces classes sont faites dans le même but, alors peut-être que vous avez des idées à partir de là. – sfussenegger

+0

Ça a l'air cool .. Je vais jeter un coup d'oeil. Merci un million. – DragonBorn

Répondre

3

Si vous avez besoin de verrouillage dans un système de fichiers, vous devez créer un répertoire. Le répertoire existe signifie "verrouillé", le répertoire manquant signifie déverrouillé.

La raison en est que la création et la suppression de répertoires doivent être des opérations atomiques dans tout système de fichiers. Ainsi, dès que deux processus essaieront de créer le même répertoire, l'un d'entre eux aura une erreur.

+0

EDITED: La création d'un répertoire n'est pas une option car d'autres programmes devraient pouvoir lire le contenu du fichier. Le verrouillage/déverrouillage n'a lieu que pendant la mise à jour. – DragonBorn

+0

Pourquoi n'est-ce pas une option? Les autres programmes ne se soucient pas du répertoire (vous n'avez pas besoin de placer le fichier dans ce répertoire). – sfussenegger

+0

Corrigez-moi si je me trompe. Donc je vais créer un répertoire et le verrouiller quand le fichier doit être mis à jour plutôt que de verrouiller le fichier? – DragonBorn