DMI's Blog sur les technos .NET(dotnet) et J2EE

FileSystemWatcher

FileSystemWatcher

Une petite histoire

 

Un jour mon boss entre dans mon bureau et me demande si c’est facile de faire communiquer deux applications GRC distantes (Gestion de la Relation Client) développées sous .NET sachant qu’on n’avait pas la main sur l’une d’elles. J’ai répondu qu’il suffit de passer par .NET Remoting (trop lourd) ou utiliser un WebService (inadapté) car on n’avait besoin que d’une méthode (celle qui retourne les infos concernant le nouveau client). Mauvaise réponse !

 

L’idée :

 

La première application avais pour rôle de créer de nouveaux clients et d’effectuer un minimum de vérifications (adresse postale, mail, âge, …) et la seconde devait récupérer ces informations pour géocoder les adresses postales afin de les placer sur une carte.

 

Le principe:

 

Le principe serait d’avoir un répertoire commun aux deux applications dans lequel l’application 1 pourra déposer la description du nouveau client et l’application 2 devra vérifier à intervalle régulier si un nouveau client a été créé.

 

L’architecture :

 

Les deux applications appartenant au même réseau local (et domaine) nous avons créé un répertoire partagé nommé Spy contenant un fichier nommée Customers.xml.

 

L’application 1 devait créer un client puis le rajouté dans le fichier xml et l’application 2 vérifier à intervalle régulier si le fichier avait été modifié pour le lire.

 

Cette technique est très utilisée dans les applications EAI pour faire communiquer plusieurs applications hétérogènes.

 

La solution :

 

Après un peu de recherche sur le web j’ai vu que je n’avais pas à développer des containers ni de connecteurs comme dans les EAI puisque .NET offre une classe très particulière et peu utilisé qui permet de le faire : FileSystemWatcher.

 

Pour le faire :

 

  • Créer une application Windows console
  • Ajouter ceci :

 

using System;

using System.IO;

namespace ConsoleApplicationTests

{

/// <summary>

/// Description résumée de Class1.

/// </summary>

class Class1

{

/// <summary>

/// Point d'entrée principal de l'application.

/// </summary>

[STAThread]

static void Main(string[] args)

{

// Création de l’objet FileSystemWatcher

FileSystemWatcher MyWatcher = new FileSystemWatcher();

// Répertoire à surveiller \\par-madiop\Spy

MyWatcher.Path = @"\\MaMachine\Spy";

 

// Ne pas surveiller les répertoires fils

MyWatcher.IncludeSubdirectories = false;

// Filtre pour les notifications

MyWatcher.NotifyFilter = NotifyFilters.LastAccess |

NotifyFilters.LastWrite |

NotifyFilters.FileName |

NotifyFilters.DirectoryName;

 

// Superviser uniquement le fichier Customers.xml

MyWatcher.Filter = "Customers.xml";

 

//En cas de changement de Customer.xml -> appeler la méthode OnChange

MyWatcher.Changed += new FileSystemEventHandler(OnChanged);

//En cas de création de Customer.xml -> appeler la méthode OnChange

MyWatcher.Created += new FileSystemEventHandler(OnChanged);

 

// Permettre le composant de commencer à superviser nles changements

MyWatcher.EnableRaisingEvents = true;

 

//Maintenir la console afficher pour voir défiler les changements

Console.WriteLine("Press \'q\' to quit.");

while(Console.Read()!='q');

 

}

 

public static void OnChanged(object source, FileSystemEventArgs e)

{

Console.WriteLine("{0} : Changed", System.DateTime.Now);

}

 

}

}

 

 

aucun commentaire - aucun rétrolien

Comment exécuter un package DTS à partir d’une procédure stockée ?

 

Malheureusement aucunes commandes T-SQL ne permettent d’exécuter un dts, mais il existe cependant deux « solutions de contournement » :

 

  • Passer par xp_cmdshell and dtsrun
  • Utilisez les procedures stockées OLE (sp_OACreate, sp_OAGetErrorInfo, …)

 

Dans cette première partie nous allons utiliser la première méthode car plus facile à mettre en œuvre bien que plus contraignante en terme de gestion de sécurité

 

DTSRUN est un utilitaire qui vous permet d’exécuter un lot, ou le planifier sans utiliser le fameux Microsoft Management Console (MMC). Pour exécuter cette commande vous devez bien sûr avoir MS SQL Server sur votre machine.

Lancer l’invite de commande (démarrer->exécuté puis tapez « cmd ») puis tapez dtsrun pour avoir l’aide concernant l’utilisation de celle-ci.

 

Syntaxe

 

dtsrun
[/?] |
[
    [
        /[~]S server_name[\instance_name]
        { {/[~]U user_name [/[~]P password]} | /E }
    ]
    {    
        {/[~]N package_name }
        | {/[~]G package_guid_string}
        | {/[~]V package_version_guid_string}
    }
    [/[~]M package_password]
    [/[~]F filename]
    [/[~]R repository_database_name]
    [/A global_variable_name:typeid=value]
    [/L log_file_name]
    [/W NT_event_log_completion_status]
    [/Z] [/!X] [/!D] [/!Y] [/!C]
]

 

Utilitaire d’aide à la génération de la commande

 

Il existe un utilitaire qui permet de générer graphiquement la commande nécessaire pour l’exécution d’un lot donnée.

Supposons que nous avons besoin de générer la commande d’exécution du lot suivant

 

Nom : abcdTest

Server : MyServer

User name = sa

Pwd = pwd

Variable globale : NBLigne avec comme valeur 780

Fichier journal : C:\Temp\log.txt

 

Se qu’il faut faire :

 

  • Tapez en ligne de commande «dtsrunui » puis à l’ouverture de l’utilitaire graphique entrez vos paramètres (Emplacement, Nom du serveur, utilisateur, mot de passe puis le nom du lot).
  • Cliquez sur « Avancé » puis choisissez votre variable globale puis entrez la valeur voulue.
  • Choisissez le chemin de votre fichier de log
  • Cliquez sur « Générer… »
  • Copiez le résultat généré

 

NB : cet utilitaire vous donne aussi la possibilité de planifier l’exécution de votre lot.

 

Le résultat doit être semblable à quelque chose comme :

 

DTSRun /S "MyServer " /U "sa" /P "pwd" /N "abcdTest " /G "{5360FD4D-5326-4640-B06C-31E8652F48B3}" /L "C:\Temp\log.txt" /A "NBLignes":"780"="78" /W "0"

 

Vous pouvez tester votre commande en l’exécutant en ligne de commande

 

La seconde étape consiste à exécuter cette commande dans MS SQL Server.

MS SQL Server offre la possibilité d’exécuter des lignes de commande grâce à la procédure stockée xp_cmdshell (à utiliser avec prudence et parcimonie) qui se trouve dans la base master.

 

Ouvrez l’analyseur de requêtes puis tapez exec master..xp_cmdshelldir. Cela aura pour effet de lister les fichiers situés sur le disque dur de la machine sur laquelle SQL Server est installé.

 

Pour exécuter votre commande créez une procédure stockée contenant le code suivant :

 

DECLARE @CMD varchar(1000)

 

SET @CMD = DTSRun /S "MyServer " /U "sa" /P "pwd" /N "abcdTest " /G "{5360FD4D-5326-4640-B06C-31E8652F48B3}" /L "C:\Temp\log.txt" /A "NBLignes":"780"="78" /W "0"

exec master..xp_cmdshell @CMD

 

Et voilà, c’est partiiiiiiii

aucun commentaire - aucun rétrolien