Notification des changements sur des fichiers ou des répertoires

Imaginons que souhaitiez rafraîchir la configuration de votre application ou la map des templates que vous avez en cache sans relancer l'application. Dans cet article, nous verrons comment faire. C'est-à-dire comment appeler une fonction dès qu'un fichier ou un répertoire est modifié.

Pour commencer, il faut inclure le package experimental fsnotify (développé par l'équipe golang, mais pas encore inclut dans la distribution officielle).

import "code.google.com/p/go.exp/fsnotify"

Il faut ensuite :

  1. Créer un objet watcher (fsnotify.NewWatcher()).
  2. Créer un processus léger contenant une boucle infine qui attend un évènement de modification.
  3. S'abonner à un ou plusieurs types de modifications en modifiant les drapeaux (watcher.WatchFlags("./conf/config.json", fsnotify.FSN_MODIFY)). Pour s'abonner à plusieurs modifications, il suffit de cumuler les options à l'aide d'un OR (watcher.WatchFlags("./conf/config.json", fsnotify.FSN_DELETE | fsnotify.FSN_RENAME)).
// fsConfigWatcher watches if the configuration file is modified and reload the
// configuration dynamically is the file has been changed
func fsConfigWatcher() {
	watcher, err := fsnotify.NewWatcher()
	if err != nil {
		logFatal("(fsConfigWatcher) fsnotify.NewWatcher() : ", err)
	}

	go func() {
		for {
			select {
			case ev := <-watcher.Event:
				logInfo("event: %v", ev)
				file, err := ioutil.ReadFile(CONFIGURATION_FILE)
				if err != nil {
					logFatal("(main) Configuration file : ", err)
				}
				json.Unmarshal(file, &config)
			case err := <-watcher.Error:
				logInfo("error: %v", err)
			}
		}
	}()

	err = watcher.WatchFlags("./conf/config.json", fsnotify.FSN_MODIFY)
	if err != nil {
		logFatal("(fsConfigWatcher) watcher.WatchFlags(fsnotify.FSN_MODIFY) : ", err)
	}
}

S'abonner aux modifications d'un répertoire

Pour s'abonner aux modifications effectuées sur un répertoire (utile pour recharger les template mis en cache par votre application), il suffit d'indiquer un chemin vers un répertoire :

err = watcher.WatchFlags("./tmpl/", fsnotify.FSN_MODIFY)

Les autres types de modification

Les autres types de modification sont les suivants :

Les types de changements pris en charge par fsnotify
ConstanteDescription
FSN_CREATECréation d'un objet ou de l'objet
FSN_MODIFYModification d'un objet ou de l'objet
FSN_DELETESuppression d'un objet ou de l'objet
FSN_RENAMEChangement du nom d'un objet ou de l'objet



Étiquettes :   fsnotify   thirdparty 
Portrait de Benjamin BALET
Benjamin BALET
Consultant APM

Retrouvez mes cooordonées

Benjamin BALET sur viadeo






Vous aimerez aussi

Les lois de la réflexion

Une traduction du blog officiel de golang expliquant le mécanisme de la réflexion en Go.   Lire »

Stocker la configuration d'un programme golang en JSON

Comment utiliser les fonctions d'encodage et de décodage du paquet encoding/json et quelques astuces complémentaires.   Lire »

Comment gérer efficacement les erreurs en golang ?

Préconisations officielles pour la gestion des erreurs dans un programme golang. Cet article complète les explications sur panic, defer et recover   Lire »

Comment écrire du code Go ?

Traduction d'une partie des spécifications officielles du langage Go, cet article explique comment développer en Go.   Lire »

Gérer les informations de session avec Gorilla

La bibliothèque standard de go ne gère pas les variables de session d'une application. Il existe une solution avec le toolkit Gorilla   Lire »

Commentaires

Soyez le premier à commenter cet article

Publier un commentaires

Tous les commentaires sont soumis à modération. Les balises HTML sont pour la plupart autorisées. Les liens contextuels et intéressants sont en follow.

(requis)
(requis)
(requis, mais non publié)
(recommandé si vous souhaitez être publié)