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.
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.