Q4 tp_jmnds

Conception de logiciels Intranet : patrons et canevas

Moderators: douinj, graffiop

Post Reply
burckh_s
Posts: 20
Joined: 01 Nov 2021 16:13

Q4 tp_jmnds

Post by burckh_s » 14 May 2022 15:10

Bonjour,

J'ai reussi à passer les testes unitaires de la Q4, mais il ne teste pas les notifications et je ne reçois rien.

J'ai fais cela :

Code: Select all

private static long sequenceNumber = 0L;
    private class JMXDS2438Listener implements ServiceListener {

        @Override
        public void serviceAdded(ServiceEvent event) {

            // envoi d'une notification  
               
            System.out.println("Service Addedd : " + event.getName() + "." + event.getType());
            Notification notif = new Notification("ServiceAdded",this,
                    sequenceNumber, System.currentTimeMillis(),
                    event.getName());
            sequenceNumber++;
            ServiceLocator.this.sendNotification(notif); //sendNotification(notif); ne fonctionne pas non plus
        }
Ensuite, j'ai réessayé en le lançant dans un autre thread.

ENfin, J'ai ajouté un exectutor au constructeur :

Code: Select all

private ServiceLocator() throws Exception, IOException{ 
        super(Executors.newFixedThreadPool(5));
    }
Mais rien ne fonctionne. J'ai bien compris que c'était un problème de thread, et que la classe JMXDS2438Listener était appelé plus tard, mais je n'ai trouvé aucune solution.

Pour info, si je met une notification sur la méthode open (ou tous autres méthodes de ServiceLocator), cela fonctionne parfaitement.

douinj
Posts: 462
Joined: 18 Mar 2009 15:46

Re: Q4 tp_jmnds

Post by douinj » 15 May 2022 11:42

Bonjour un extrait conséquent ... d'une solution ... Bonne fin de tp

Code: Select all

public final class ServiceLocator extends NotificationBroadcasterSupport implements ServiceLocatorMBean{

  //public static final String SERVICE_TYPE = "_ds2438._tcp.local.";
  private static question3.ServiceLocatorI serviceLocatorQ3;
  static{
      try{
         serviceLocatorQ3 = question3.ServiceLocatorDS2438.getInstance();
      }catch(Exception e){
          e.printStackTrace();
      }
  }
  
  private JmDNS jmdns;
  
  private static ServiceLocator instance = null;
  
  public static ServiceLocator getInstance() throws Exception{
    if(instance==null){
        instance = new ServiceLocator();
    }
    return instance;
  }

  private JMXDS2438Listener jmxDS2438Listener;
  
  private ServiceLocator() throws IOException{
  }

  public void open() throws Exception{
    if(jmdns == null){
      serviceLocatorQ3.open();
      this.jmdns = JmDNS.create();
      this.jmxDS2438Listener = new JMXDS2438Listener();
      this.jmdns.addServiceListener(ServiceLocatorI.SERVICE_TYPE_DEFAULT, jmxDS2438Listener);
    }
  }
  
  public HTTPSensor lookup(String sensorName) throws Exception{
    return serviceLocatorQ3.lookup(sensorName);
  }
     
  
  public List<String> allSensorsNames(){
    return serviceLocatorQ3.allSensorsNames();
  }
  
  public List<String> allValidSensorsNames(){
    return serviceLocatorQ3.allValidSensorsNames();
  }
  public List<String> allSensorsNamesOutOfService(){
    return serviceLocatorQ3.allSensorsNamesOutOfService();
  }

  public void close( ){
    synchronized(this){
      if(jmdns!=null){
        jmdns.removeServiceListener(ServiceLocatorI.SERVICE_TYPE_DEFAULT, jmxDS2438Listener);
        jmxDS2438Listener = null;
        try{
            jmdns.close();
        }catch(Exception e){
        }finally{
          jmdns = null;
        }
      }
    }
    System.gc(); // au cas où, mais rien ne garantit que le gc sera appelé
  }
  
  
  
  
  private static long sequenceNumber = 0L;
  private class JMXDS2438Listener implements ServiceListener {
      
        @Override
        public void serviceAdded(ServiceEvent event) {
            //System.out.println("Service added   : " + event.getName() + "." + event.getType());
            //System.out.println("new DS2438 ! : " + number.getAndIncrement());
            System.out.println("Service added   : " + event.getName() );
            sendNotification(new Notification("serviceAdded",ServiceLocator.this,sequenceNumber++,event.getName()));
        }

        @Override
        public void serviceRemoved(ServiceEvent event) {
            //System.out.println("Service removed : " + event.getName() + "." + event.getType());
            //System.out.println("Service removed : " + event.getName() );
            sendNotification(new Notification("serviceRemoved",ServiceLocator.this,sequenceNumber++,event.getName()));

        }

        @Override
        public void serviceResolved(ServiceEvent event) {
          //System.out.println("Service resolved : " + event.getName() + "." + event.getType());
          System.out.println("Service resolved : " + event.getName() );
          sendNotification(new Notification("serviceResolved",ServiceLocator.this,sequenceNumber++,event.getName()));
        }
      }
      

    
    

}

Post Reply