Cours de révision :Durable

Programmation Avancée

Modérateur : Douin

Vivel
Messages : 44
Inscription : 19 févr. 2018 13:27

Cours de révision :Durable

Message par Vivel » 03 avr. 2018 14:48

Bonjour,
Dans la Q1 question sur Durable de l'examen 2017
classe : PubDurableSubImpl

je ne comprends pas ce bout de code : pour moi le else n'a pas de sens si ce n'est pas un subscriber alors ce ne peut pas être un DurableSuscriber.

Code : Tout sélectionner

// Puis je publie le message du param à publier pour tous (Suscriber et DurableSuscriber) 
      if(publish(name, message)){ // si le subsriber existe je publie
        number++;
      }else{ 
      // s'il n'existe pas dans la Map<String,SubscriberI> subscribers, 
      // c'est que c'est pas un Subscriber ni DurableSuscriber 
      // puisque dans la méthode subscribe  on l'ajoute au Map. donc le reste le else n'a pas de sens ??
        if(liste != null) 
        // ici on teste si c'est un DurableSuscriber : s'il existe une liste alors s'en est un !  
        // on aurait aussi pu tester que le nom du Suscriber qui était dans le TreeMap messages.
          liste.add(message); // et on sauvegarde du message...
      }
      
la méthode dans son entier que j'ai essayé de commenter :

Code : Tout sélectionner

//Pour une liste de nom, je publie un message 
  @Override
  public int publish(String[] names, Message message){
    int number = 0;
    for(String name : names){
      List<Message> liste = messages.get(name); 
      // Depuis mon TreeMap je récupère la liste de msg associé à chq nom

  // s'il existe une liste c'est que c'est un DurableSuscriber dc je renvoie tous les msg en attente
      if(liste != null && liste.size()>0){ 
        Iterator<Message> it = liste.iterator();
        while(it.hasNext()){ // ré-émission de tous les messages
          Message msg =  it.next();
          boolean result = publish(name,msg);
          if(result){ // si bonne réception
            number++;
            it.remove(); // j'efface le msg (si pas d'erreur remet la liste à 0)
          }
        }
      }
  // Puis je publie le message du param à publier pour tous (Suscriber et DurableSuscriber) 
      if(publish(name, message)){ // si le subsriber existe je publie
        number++;
      }else{ 
        if(liste != null) 
          liste.add(message); 
      }
      
    }   
    return number; // je renvoi le nb de subscribers à qui on a publié
  }

Si qlq peut m'expliquer :( ou alors il y a une erreur ? j'en doute ;)
merci
virginie

Douin
Messages : 344
Inscription : 18 mars 2009 15:46

Re: Cours de révision :Durable

Message par Douin » 09 avr. 2018 10:18

Bonjour,

La propriété d'un "DurableSubcriber" est de ne pas perdre de notifications, même si le souscripteur est en retard...

La proposition/prototype faite dans la correction est de mémoriser les notifications dans une liste et de délivrer tous les messages de cette liste, si ils existent, quand le souscripteur "durable " se présente

C'est perfectible, mais juste pour l'idée, à l'examen, il était demandé une idée d'une solution

Bon travail de révision


Code : Tout sélectionner

public class Pub[b]DurableSub[/b]Impl extends PubSubImpl{ 
  private Map<String, List<Message>> messages; 
  public PubDurableSubImpl(String name){ 
    super(name); 
    this.messages = new TreeMap<String, List<Message>>(); 
  } 
  public int publish(String[] names, Message message){ 
    int number = 0; 
    for(String name : names){ 
      List<Message> liste = messages.get(name); 
      if(liste != null && liste.size()>0){ // c'est un DurableSuscriber alors émission de tous les messages en retard...
        Iterator<Message> it = liste.iterator(); 
        while(it.hasNext()){ // ré-émission de tous les messages 
          Message msg =  it.next(); 
          boolean result = publish(name,msg); 
          if(result){ // si bonne réception 
            number++; 
            it.remove(); 
          } 
        } 
      } 
      if(publish(name,message)){ 
        number++; 
      }else{ 
        if(liste != null) // c'est un DurableSuscriber, il fait partie de la liste
          liste.add(message); // alors sauvegarde du message... 
      } 
    } 
    return number; 
  } 
  
    @Override 
  public boolean subscribe(SubscriberI subscriber){
    boolean res = super.subscribe(subscriber); 
    if(res && subscriber instanceof DurableSubscriber){ // c'est un DurableSuscriber, il fait maintenant partie de la liste
      if(messages.get(subscriber.getName())==null){
        messages.put(subscriber.getName(),new ArrayList<Message>()); 
      } 
    } 
    return res;
    }}
  
  
  

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité