Exercices dirigés NSY102

Cet ED reprend en partie les questions de l'examen de Septembre 2008,

       ici http://jfod.cnam.fr/NSY102/annales/2008_septembre/ExamenNSY102Septembre2008.pdf

 

L'archive à compléter est ici ed_06_rmi.jar

 

Question1 : Patron Dynamic Router

 

Ce patron permet d’adresser un message à certains receveurs. Le choix des receveurs est effectué en fonction du contenu du message.

Un filtre, associé à chaque receveur lors de son inscription, précise le contenu souhaité du message.

Ce filtre peut être mis à jour en cours d’exécution et un receveur être inhibé temporairement.

 

 

source : http://www.enterpriseintegrationpatterns.com/

 

Ci dessous, une architecture de classes Java reflétant le Patron DynamicRouter, les receveurs, les filtres et les messages,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

L’interface DynamicRouterI<M> ci-dessous, dans laquelle M représente le type du message, contient les opérations :

·        d’installation d’un receveur (installReceiver) avec le filtre associé,

·        de retrait d’un receveur (uninstallReceiver),

·        d’une mise à jour d’un receveur (updateReceiver),

·        d’envoi d’un message aux receveurs concernés (sendMessage),

·        de validation (setEnabled) ou d’invalidation (setDisabled) de l’envoi de message à un receveur,

·        d’obtention de la liste des receveurs installés (getReceivers),

·        d’obtention de la liste des receveurs « injoignables » (getDeadReceivers),

·        d’obtention du nom donné au routeur par l’utilisateur (getName).

 

/** Patron DynamicRouter.

 * M représente le type de message.

 */

public interface DynamicRouterI<M>{

 

  /** Installation d'un receveur de message.

   * @param receiver le receveur.

   * @param filter le filtre à appliquer sur le contenu du message.

   * @throws Exception en cas de doublons.

   */

  public void installReceiver(ReceiverI<M> receiver, FilterI<M> filter) throws Exception;

 

  /** Mise à jour d'un receveur de message.

   * @param receiver le receveur.

   * @param filter le "nouveau" filtre à appliquer sur le contenu du message.

   * @throws Exception si le receveur n'existe pas, n'a pas été installé.

   */

  public void updateReceiver(ReceiverI<M> receiver, FilterI<M> filter) throws Exception;

 

  /** Retrait définitif d'un receveur de message.

   * @param receiver le receveur.

   * @throws Exception si le receveur n'existe pas, n'a pas été installé.

   */

  public void uninstallReceiver(ReceiverI<M> receiver) throws Exception;

 

  /** Envoi d'un message aux receveurs installés.

   * Cet envoi est conditionné par la réussite du filtre et l'autorisation à recevoir.

   * Les receveurs "injoignables" (ayant levé une exception) sont extraits et placés

   *  dans un ensemble accessible par la méthode getDeadReceivers.

   * @param msg le message.

   * @return le nombre de receveurs auxquels ce message a été envoyé.

   */

  public int sendMessage(M msg);

 

  /** Autorisation de recevoir un message.

   * Par défaut, dès son installation le receveur est autorisé.

   * @param received le receveur.

   * @throws Exception si le receveur n'existe pas, n'a pas été installé.

   */

  public void setEnabled(ReceiverI<M> receiver) throws Exception;

 

  /** Inhibition de l'envoi d'un message vers ce récepteur.

   * @param received le receveur.

   * @throws Exception si le receveur n'existe pas, n'a pas été installé.

   */

  public void setDisabled(ReceiverI<M> receiver) throws Exception;

 

  /** Obtention de la liste, un ensemble des receveurs installés.

   * @return l'ensemble des receveurs.

   */

  public Set<? extends ReceiverI<M>> getReceivers();

 

  /** Obtention de la liste, un ensemble des receveurs injoignables.

   * @return l'ensemble des receveurs injoignables.

   */

  public Set<? extends ReceiverI<M>> getDeadReceivers();

 

  /** Obtention du nom du routeur transmis à la création.

   * @return le nom de ce routeur.

   */

  public String getName();

 

}

 

 

L’interface ReceiverI<M> est à implémenter par les receveurs du message, les messages sont de type M :

 

public interface ReceiverI<M> extends Serializable{

 

 /** Envoi du msg à ce receveur.

   * @return le message.

   * @Exception si ce receveur est injoignable.

   */

  public void receive(M msg) throws Exception;

 

  /** Obtention du nom du receveur transmis à la création.

   * @return le nom de ce receveur.

   * @Exception si ce receveur est injoignable.

   */

  public String getName()throws Exception;

}

 

 

L’interface FilterI<M> représente le filtre associé à un receveur, il détermine l’envoi du message au receveur selon son contenu.

 

public interface FilterI<M> extends Serializable{

 

  /** Filtre sur les messages.

   * @param msg le message.

   * @return true si le filtre accepte le message, false autrement.

   */

  public boolean accept(M msg);

}

 

L’interface MessageI<E> reflète le message et les méthodes d’accès au contenu de ce message de type E.

 

public interface MessageI<E> extends Serializable{

 

  public E getContent();

  public void setContent(E content);

}

 

 

Un diagramme de séquences possible, un client (Main), un « DynamicRouter (router) et 4 receveurs (a,b,c,d)

Question1-1)

Ecrivez une implémentation complète de la classe DynamicRouter. Certaines descriptions d’interfaces extraites du paquetage java.util sont en annexe.

 

 

Pour cet ED vous avez déjà la réponse à cette question

Question1-2)

Proposez les classes StringMessage un message dont le contenu est une String (c.f. new StringMessage("meteo_rain") sur le diagramme ) et ContainsFilter, un filtre qui vérifie si le contenu du message contient le terme transmis à sa création (c.f. new ContainsFilter("meteo")  sur le diagramme).

 

 

Question1-3)

Développez une méthode Main.main, reflétant le diagramme de séquences ci-dessus.

 


 

   

Question2 : Patron DynamicRouter en intranet / RMI

 

 

Question2-1) Proposez un schéma d’une architecture utilisant le patron DynamicRouter en intranet avec la technologie RMI. Les émetteurs, les receveurs(receiver) et le routeur(router) sont installés sur des machines différentes reliées entre-elles.

 

Précisez quels sont les services, quels sont les clients et où se trouvent les annuaires.

 

Question2-suite)

  Soit ci-dessous, une architecture de classes possible de ce patron en version intranet/rmi :

 

L’interface DynamicRouterRemoteI  contient les mêmes noms de méthodes avec les mêmes fonctionnalités que les méthodes de l’interface DynamicRouterI de la question 1. Les descriptions des classes ou interfaces extraites des paquetages java.rmi et java.rmi.server sont en annexe.

 

Cette nouvelle interface adaptée pour RMI,

·        ajoute la clause throws RemoteException pour chaque méthode,

·        hérite au sens des interfaces de java.rmi.Remote.

 

import question1.FilterI;

import question1.ReceiverI;

 

import java.util.Set;

import java.rmi.Remote;

import java.rmi.RemoteException;

 

public interface DynamicRouterRemoteI<M> extends Remote{

 

  void installReceiver(ReceiverRemoteI<M> receiver, FilterI<M> filter) throws RemoteException;

  void updateReceiver(ReceiverRemoteI<M> receiver, FilterI<M> filter) throws RemoteException;

  void uninstallReceiver(ReceiverRemoteI<M> receiver) throws RemoteException;

 

  int sendMessage(M msg)throws RemoteException;

 

  void setEnabled(ReceiverRemoteI<M> receiver) throws RemoteException;

  void setDisabled(ReceiverRemoteI<M> receiver)throws RemoteException;

 

  Set<? extends ReceiverI<M>> getReceivers()throws RemoteException;

  Set<? extends ReceiverI<M>> getDeadReceivers()throws RemoteException;

 

}

 

 

 

 

Question2-2) Proposez une implémentation complète de la classe DynamicRouterRemote.

 

 

Pour cet ED vous avez déjà la réponse à cette question

Question2-3) Ecrivez l’interface ReceiverRemoteI.

 

 

Question2-4) Proposez une classe ReceiverRemote. Lors de la réception d’un message, un simple affichage du message reçu suffira.

 

 

Valider la classe de tests unitaires TestMainRemote