tp_thread

  • Les threads
  • Les requêtes HTTP
  • Le pattern Chaîne de responsabilités

 


[Image]Acquisition cyclique

 

Il s'agit de lire les valeurs d'un capteur accessible au protocole HTTP.

       2)  depuis votre navigateur cliquez sur ce lien http://localhost:8999/ds2438/ ,

Le source de la page retournée

# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=21.923176
(1C0000000D536B26 représente le numéro du composant, 21.923176 le taux d'humidité relative)

côté serveur la fenêtre devrait mentionner

 

Architecture retenue

Architecture présentée :

HumiditySensor reflète ce que l'on attend d'un capteur : une valeur, et la période minimale de lecture
HTTPSensor le capteur au protocole HTTP, d'autres types capteurs pourraient être installés


Main et Main2 sont des applications Java, qui peuvent s'exécuter dans une fenêtre DOS

CyclicAcquisition effectue une acquisition périodique de la valeur du capteur et transmet cette information
Command<T> est une interface qui propose le traitement d'une information de type T, ici une valeur du capteur
ConsoleCommand<T> se contente d'afficher T et l'heure courante

 

question1_1)

Complétez la classe Main, en affichant les résultats de deux requêtes, ci-dessous une trace d'exécution

question1_2)

Complétez la classe HTTPSensor en implémentant la méthode value();

Cette méthode a la signature suivante :

public float value() throws Exception;

la valeur retournée aura un seul chiffre après la virgule,


Pour répondre à cette question, vous devez utiliser la classe java.util.StringTokenizer .

Complétez de nouveau la classe Main, en affichant les résultats de deux lectures du capteur

ci-dessous une trace d'exécution

 

question1_3) Complétez la classe CyclicAcquisition, contenant un Thread local. Ce Thread permet l'acquisition cyclique du taux d'humidité.

La période d'acquisition doit être respectée en utilisant la méthode minimalPeriod() de la classe HumiditySensor, cette version néglige le temps de communication : Requête HTTP et analyse du résultat.

L'information reçue est affichée sur la console par une implémentation de l'interface Command<T>, ici ConsoleCommand<T>.

Complétez la classe de Main2, en créant une acquisition cyclique, veillez à la bonne terminaison du programme

Un exemple de traces possible,

 

ouvrez une fenêtre DOS>

  1. placez vous dans le répertoire du tp
  2. exécutez les commandes suivantes
    1. Classes préalablement compilées avec bluej
    2. java -cp . question1.Main2 http://localhost:8999/ds2438/en mode simulé

       

question1_4) Proposer une version de la question précédente qui prend en compte le temps de communication : Requête HTTP et analyse du résultat. Voir la méthode System.currentTimeMillis()

à la question 1-3 nous avions

la réponse attendue en 1-4

 


Chaîne de responsabilités

L'information reçue, le taux d'humidité, est maintenant transmise à différents consommateurs(responsables...). Les consommateurs sont chaînés entre eux. Ce type de conception est issu du pattern "chaîne de responsabilités". Le principe est de transmettre l'information à une chaîne de consommateurs, chaque consommateur décide si il doit laisser passer l'information vers son successeur ou bien arrêter sa propagation.

question2_1) Proposer une première "Chaîne de responsabilités" constituée de 3 "Handlers" liée à notre application de lecture cyclique du taux d'humidité et complétez la classe Main

Architecture retenue :

Handler<T>, TraceHandler, MinHandler, MaxHandler les gestionnaires attendus
ChainCommand<T> convertit la "commande" vers une chaîne de responsabilités
Main est une application Java, qui doit s'exécuter dans une fenêtre DOS

Attention ! respectez les formats d'affichage montrés dans la fenêtre DOS ci-dessous.

Une Trace d'exécution possible

ouvrez une fenêtre DOS>

  1. placer vous dans le répertoire du tp
  2. exécuter java -cp . question2.Main http://localhost:8999/ds2438/
  • Ces quelques lignes Java fournissent la date et heure courante :
        Calendar c = Calendar.getInstance();
        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT,Locale.FRANCE);
        DateFormat dt = DateFormat.getTimeInstance(DateFormat.SHORT,Locale.FRANCE);
        String date = df.format(c.getTime()) + "-" + dt.format(c.getTime());
    
    avec	import java.util.Calendar;
    	import java.text.DateFormat;
    	import java.util.Locale;
    
  • Pour plus de détails, voir la classe Calendar.

 

question2_2) Ajouter le maillon FileHandler dans la chaîne et au bon endroit, ce 'handler' est chargé de la sauvegarde sur fichier des mesures obtenues.


Humidité Relative : définition extraite de http://www.credo.fr/monde/page/pf_090799.htm
L'Humidité Relative (HR) exprime le rapport entre la quantité effective de vapeur d'eau dans un volume donné d'air et la quantité maximale que ce volume peut contenir à la même température.
L'eau s'évapore dans l'atmosphère jusqu'à ce que soit atteinte une proportion maximale de vapeur d'eau dans l'air, dite humidité saturante.
Quand cette condition est atteinte, la moindre chute de température provoque la condensation de la vapeur et l'apparition de minuscules gouttes d'eau. Il s'agit du phénomène de rosée.
La saturation de l'air en vapeur d'eau (ou point de rosée) correspond donc à 100 % d'humidité relative.


La quantité de vapeur d'eau dans l'air à 100 % HR est d'environ 15 grammes d'eau par mètre cube d'air.

Quand la quantité de vapeur d'eau dans l'air est en deçà de la saturation, l'humidité relative est infèrieure à 100 %.
A peu de choses près, une HR de 70 % correspond à une quantité d'eau par mètre cube d'air de 70 % de la quantité présente à saturation: environ 10,5 grammes d'eau par mètre cube d'air.


 

 


Design Pattern et UML


extrait de http://www.eli.sdsu.edu/courses/spring04/cs635/notes/chain/chain.html