Le service d'observations

 

Dans le réseau, il y a 2 services avec une seule representation :  le service de log et le service de coordination, et plusieurs services avec plusieurs representations source et image.
 

Le service de coordination enregistre les demandes des sources et des images et fait la liaison entre les deux. Pour cela, il stocke dans deux tables les sources et les images qui y sont enregistrees.

Le service de log recoit des demandes d'ecriture dans un fichier de log. Ce fichier s'appelle observation.log ;  son nom se trouve dans le fichier Info.java et peut etre modifie.
 

Dans Info.java se trouvent le nom des machines des services observation et log. Si different, il faut changer ces lignes et compiler.
 

Compilation du paquetage observation:
$ setenv CLASSPATH ~dedu/Java:.
$ cd ~dedu/Java/observation
$ make

Lancement (dans cet ordre):
$ java Log (sur la machine de log)
$ java Coord (sur la machine de coord)
lancement des usagers
 

Naming.bind et rmiregistry sont necessaires seulement si on veut utiliser URL et le nom de service (il est necessaire seulement pour trouver une reference vers l'objet distant). Par consequent, rmiregistry sera lance seulement sur les machines de log et de coordination.
 

Le nom (externe) d'une variable represente le nom unique sous lequel une variable est connue dans le reseau.
 

A chaque source (image) correspond un objet distant (qui n'a pas besoin de s'enregistrer aupres de rmiregistry).
 

Le service de coordination stocke les sources (images) dans un Hashtable qui contient:
- key   : le nom de la source (image)
- value : un objet de type SrcItem (ImgItem)
 
Le code de la classe SrcItem:
SourceI source  // reference vers la source
 
Le code de la classe ImgItem:
ImageI image  // ref. vers l'image
String srcName  // le nom de la source associee
 
 

La classe Image fournit une methode statique appelee getSourceValue pour connaitre la valeur d'une source sans creer une image.
 
 

L'utilisation du paquetage pour les usagers est le suivant :

- pour une source :
obj.value = 2;
objSource.changed(obj);   // informe la source que la source-variable a change de valeur

- pour une image :
(cast)nImage.var;   // retourne la valeur courante de l'image

 

J'ai utilise Enumeration plusieurs fois. Enumeration a l'avantage d'etre "thread safe" (voir JavaFAQ, Q5.20), donc d'etre adapte a multi-threading.
 
Quand une source s'efface, elle transmet d'abord a toutes ses images sa derniere valeur, puis elle s'efface.
 
NB: L'usager et Source ont les references sur le meme objet. Si l'usager modifie donc la variable, soit elle utilise une autre variable, soit elle utilise un synchronise. Dans les deux cas, elle doit ensuite appeler Source.update.

Si on veut connaitre l'etat du reseau, on peut lance le programme ObsReader.

Si on a besoin, le coordinateur peut savoir la machine d'ou provient un appel RMI: The java.rmi.RemoteServer.getClientHost method returns the client host for the current invocation on the current thread.
 
 

Problemes :

Il y a encore le probleme de synchronisation (meme si je n'ai eu qu'une seule erreur jusqu'a maintenant).
 

Normalement, les sources et les images devraient etre garbage-collected. Je pense qu'il faut les de-exporter, mais cette possibilite a ete introduite dans la version JDK 1.2. J'ai travaille avec JDK 1.1.5.