TP JMX Q1

Conception de logiciels Intranet : patrons et canevas

Modérateurs : Douin, graffion

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

TP JMX Q1

Message par Vivel » 28 avr. 2018 20:01

Bonjour,
je suis complètement coincé et perdu ! pourtant j'ai refait tous les exemples du cours et aucun soucis (mis à part l'adaptateur que je n'ai pas pu faire fonctionné avec un client RMI).

SUR BLUEJ
J'obtiens cette erreur aux tests Tests_TCPServerMBean : "aucune notification en cas de panne ... ?"
mais je ne sais pas comment la corriger.
si je relance le test derrière j'obtiens : exception inattendue ! javax.management.InstanceAlreadyExistsException
EN LIGNE DE COMMANDE
TCPServerAgent renvoi : TCPServerAgent is running...
ClientRMI renvoi une autre erreur que je ne comprends pas !

Code : Tout sélectionner

Exception in thread "main" java.lang.NullPointerException
	at question1.TCPServer.getPort(TCPServer.java:59)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
	at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:112)
	at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:46)
	at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:237)
	at com.sun.jmx.mbeanserver.PerInterface.getAttribute(PerInterface.java:83)
	at com.sun.jmx.mbeanserver.MBeanSupport.getAttribute(MBeanSupport.java:206)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:647)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(JmxMBeanServer.java:678)
	at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1445)
	at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
	at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
	at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
	at javax.management.remote.rmi.RMIConnectionImpl.getAttribute(RMIConnectionImpl.java:639)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)
	at sun.rmi.transport.Transport$1.run(Transport.java:200)
	at sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
je vous mettrais bien un bout de code mais je ne sais vraiment pas quoi vu que je ne sais pas ce qui va pas… une piste serait le bienvenu. ;)
merci virginie

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

Re: TP JMX Q1

Message par Vivel » 28 avr. 2018 21:16

https://media.giphy.com/media/3oz8xMbKL ... nsized.gif
ça peut venir de là ? !

Code : Tout sélectionner

public class TCPServer extends NotificationBroadcasterSupport implements TCPServerMBean, Serializable{
    private transient ExperimentalTCPServer server;
    private boolean active;

    private long sequenceNumber = 0;

    public void create(int port) throws Exception{
        this.server = new ExperimentalTCPServer(port,new NotificationHandler());
    }

    private class NotificationHandler implements ExceptionListener, Serializable {  

        public void onException(Throwable cause){
            TCPServer.this.sequenceNumber++;
            long demarrage = System.currentTimeMillis();
            if (!isActive()){
                sendNotification(
                    new Notification(
                        "TCPServer.failure",           // un nom : affiché dans la colonne Type de Jconsole
                        TCPServer.this,                          // instance MBean     
                        sequenceNumber,        // un numéro pour l'ordre d'arrivée des notifications
                        System.currentTimeMillis(),    // une estampille
                        ""+getMaxActiveTime() // message
                    ));    
            }
            // envoi d'une notification, aux abonnés 
            // à compléter
        }
    }

    public void start(){
        server.start();
        this.active = true;
    }

    public void stop(){
        server.stop();
        this.active = false;
    }

    private boolean getActive(){
        return active;
    }

    // "getter" seulement
    public long getMaxActiveTime(){
        return this.server.maxActiveTime();
    }

    public long getPort(){
        return this.server.port();
    }

    public boolean isActive(){
        return active;
    }

}

julien_24
Messages : 47
Inscription : 17 oct. 2017 13:41

Re: TP JMX Q1

Message par julien_24 » 29 avr. 2018 10:26

Bonjour,

Pour la première exception NullPointerException la variable d'instance ExperimentalTCPServer est null dans TCPServer. (j'ai eu la meme erreur)

Cette variable est instanciée avec l'appel de create.

J'espère t'avoir un peu aidé.

julien

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

Re: TP JMX Q1

Message par Vivel » 29 avr. 2018 15:45

Bonjour,
Merci julien pour ta réponse. Malheureusement je dois être complètement ensuquée je m'y retrouve pas. Pour toi, il faut faire qlqch dans le fichier ExperimentalTCPServer ? j'ai pas encore vu la vidéo sur les ED, ça m'aiderait ?

Pour create : this.server = new ExperimentalTCPServer(port,new NotificationHandler());
j'ai vérifié, this server n'est pas null

Aujourd'hui la seule erreur qu'il me reste est la suivante :
aucune notification en cas de panne ... ?
---
junit.framework.AssertionFailedError: aucune notification en cas de panne ... ?
at question1.Tests_TCPServerMBean.test_TCPServerMBean(Tests_TCPServerMBean.java:46)

le test Tests_TCPServer est ok. Quand je suis dans la console, si je déclenche à la main le create, start, stop, subscribe tout fonctionne…

julien_24
Messages : 47
Inscription : 17 oct. 2017 13:41

Re: TP JMX Q1

Message par julien_24 » 29 avr. 2018 21:55

Re:

Non il ne faut pas toucher a ExperimentalServer.

Moi pour le NullPointerException, j'ai appelé la methode create dans le constructeur de l'agent:
voici le code plus simple:

Code : Tout sélectionner

   public TCPServerAgent() {

      // Get the platform MBeanServer
      mbs = ManagementFactory.getPlatformMBeanServer();

      TCPServerMBean bean = new TCPServer(); 
      try {
          bean.create(8088);
      } catch(Exception e) {
          e.printStackTrace();
      }.....
J'avais aussi la meme deuxieme erreur, ca a regle les 2 d'un coup.

Je sais pas si cela va t'aider l'erreur qu'il te reste vu que la premiere semble résolue.

julien

julien_24
Messages : 47
Inscription : 17 oct. 2017 13:41

Re: TP JMX Q1

Message par julien_24 » 29 avr. 2018 22:33

ReRe:

Bon alors je viens de retester Tests_TCPServerMBean, si je ne me trompe c'est sur ces tests que tu as une erreur.

J'ai retiré le bout de code que j'ai collé au dessus, de ma classe et les tests passent toujours, donc cela n'a rien a voir avec l'erreur.
Dans les tests la methode create est appelée.

Pour moi, il faut instancier le ExperimentalServer en appelant create, mais pas le problème ici, bref.

Question bete: ta classe TCPServerAgent implements bien NotificationListener? (je sais plus si c'était donné ou si il fallait compléter)

Dans la methode handleNotification() de la classe de tests Tests_TCPServerMBean, essais d'ajouter un System.out.println() pour vérifier si elle est appelée.

julien

julien_24
Messages : 47
Inscription : 17 oct. 2017 13:41

Re: TP JMX Q1

Message par julien_24 » 29 avr. 2018 22:42

ReReRe:

Ok, je crois que j'ai trouvé, dans le code que tu nous as linké de TCPServer tu vérifies si le server est actif avant d'envoyer la notification, essais de l'enlever.

Je l'ai ajouté pour tester, j'ai ton erreur.

julien

julien_24
Messages : 47
Inscription : 17 oct. 2017 13:41

Re: TP JMX Q1

Message par julien_24 » 29 avr. 2018 23:34

ReReReRe: Pour la dernière fois ;)

Ce que tu es fait, c'est a dire tester si le server est actif avant d'envoyer la notif est logique, plus que de ne pas tester comme je le fais.

Pourtant le test fait planter, mais juste avant d'arreter le server dans le test le Thread est endormi, c'est comme si il y avait un probleme de synchro, comme l'erreur est simulée la notif est envoyée avant que le server soit arrêter par server.stop() qui change le boolean a false(active dans la classe TCPServer) ce qui fait qu'il vaut vrai au moment ou il devrait envoyer la notif, et elle est pas envoyée.

C'est ce que je comprends jusqu'a maintenant, je peux encore me tromper (95% de chance je dirais).

julien

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

Re: TP JMX Q1

Message par Vivel » 30 avr. 2018 10:33

Merci beaucoup Julien de prendre le temps de t'interroger et même de tester. C'est vraiment sympa. Malheureusement, mon problème n'est pas résolu. :(

Je vais tout reprendre à zéro calmement. Télécharger la dernière version, j'ai vu passé un message de M. Douin(au cas où je ne l'avais pas fait).

Si ça fonctionne pas j'essayerais qd même de faire les questions suivantes.
je te tiens au courant. ;)
virginie

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

Re: TP JMX Q1

Message par Vivel » 30 avr. 2018 11:10

finalement je pense avoir trouvé !
j'avais pas mis le boolean active à false après avoir envoyé la notification… so stupid ;(
c'est en relisant les tests que j'ai compris. de ce fait j'ai aussi changé mon test avant notification : en effet, il y a exception donc la variable reste à true. D'ailleurs, je suis pas sûr que ça ai un sens de tester isactive…
le code :

Code : Tout sélectionner

public void onException(Throwable cause){

            TCPServer.this.sequenceNumber++;
            long demarrage = System.currentTimeMillis();
           if (isActive()){  
                sendNotification(
                    new Notification(
                        "TCPServer.failure",           // un nom : affiché dans la colonne Type de Jconsole
                        TCPServer.this,                          // instance MBean     
                        sequenceNumber,        // un numéro pour l'ordre d'arrivée des notifications
                        System.currentTimeMillis(),    // une estampille
                        ""+getMaxActiveTime() // message
                            //""+(System.currentTimeMillis()-demarrage)// un message
                    ));    
                    TCPServer.this.active = false;
            }

        }

Répondre

Qui est en ligne ?

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