IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

JFrame en remote entre JDK 5 (Serveur) et 6 (Client - VisualVM)


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant BI & Web
    Inscrit en
    Juillet 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BI & Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Par défaut JFrame en remote entre JDK 5 (Serveur) et 6 (Client - VisualVM)
    Bonjour tout le monde !

    Alors j'ai un petit soucis concernant l'ouverture d'une JFrame. J'ai recherché longuement sur le net (Developpez.com et autres), mais je n'arrive vraiment pas à trouver de solution...

    J'explique donc la situation :

    Je dois développer une application qui doit récupérer des informations de suivi d'application tout en respectant de nouvelles normes de sécurité. Pour cela j'utilise JMX qui permet le monitoring, et VisualVM pour consulter ces informations.

    J'arrive donc à me connecter sans problèmes (depuis peu ^^) à JMX depuis VisualVM.

    Il y a donc dans VisualVM un plugin permettant de récupérer les informations sur les MBean, dont celles sur les méthodes (onglet Opérations dans le plugin).
    Cela permet entre autres d'arrêter un service ou de créer un évènement.

    Mon problème vient alors lorsque j'essaie d'afficher un résultat de statistiques.
    En fait, je dois afficher, lors du clic sur un bouton de la liste des méthodes dans l'onglet "Opérations", une fenêtre avec un tableau en HTML (titres, couleurs et tout le tralala).

    Pour cela j'utilise une JFrame :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public JFrame displayHTMLJFrame(String HTML, String title){
    		JFrame fen = new JFrame();
    	    fen.setSize(1000, 800);
    	    fen.setTitle(title);
     
    	    JEditorPane pan = new JEditorPane();
    	    pan.setEditorKit(new HTMLEditorKit());
    	    pan.setEditable(false);
     
    	    pan.setText(HTML);
    	    fen.add(pan);
    	    return fen;
    	}
    Que j'appelle dans ma méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public JFrame displayHtmlSqlStatOK_VM(){
    		return displayHTMLJFrame(displaySQLStat(sqlStatOK, firstMessageDate), "SqlStatOK");
    	}
    La méthode doit donc me retourner ma JFrame, mais elle me génère une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Problem invoking displayHtmlSqlStatOK_VM : java.rmi.UnmarshalException: error unmarshalling return; nested 
     
    exception is:
    java.io.InvalidClassException: javax.swing.JFrame; local class incompatible: stream classdesc serialVersionUID = 
     
    -5208364155946320552, local class serialVersionUID = -2386951414768123374
    J'ai vu sur internet que ceci venait d'un problème de version (Sérialisation et tout et tout), et je pense donc fortement que ça vienne du fait que j'ai ceci :

    Serveur - JDK5 <----> Client (VisualVM) - JDK6

    Tout en sachant que je ne peux pas faire évoluer la version du serveur (coûts bien trop importants...) comme le préconisent certains sites et forums.

    Ma question est alors la suivante :

    Est-il possible que j'affiche cette satanée fenêtre en gardant mon architecture actuelle (JDK5 côté serveur et JDK6 côté client) ?

    Je pourrais peut-être forcer la chose ? Lui dire que y'a rien de méchant qu'il peut exécuter mon code ? Enfin j'ai beau lui demander mais il ne me répond pas Peut-être qu'à vous il vous parlera... (oui je craque ^^).

    Merci beaucoup à ceux qui me liront et m'aideront !

    Si vous avez besoin de plus d'infos surtout n'hésitez pas.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Consultant BI & Web
    Inscrit en
    Juillet 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BI & Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Par défaut Autre axe de recherche...
    La solution à mon problème pourrait peut-être se trouver ailleurs, car en fait je souhaite simplement un tableau avec un minimum de mise en page (c'est juste pour de la visualisation pour qu'un responsable d'appli ait son pitit tableau lui mettant si possible les données critiques en rouge et pis vala).

    Mais je n'ai trouvé nulle part une liste des types que je peux retourner avec VisualVM... Ce qui ne me paraît pourtant pas trop demandé

    Car si on peut afficher ça sous une autre forme pourquoi pas...

    Après j'avais pensé à une solution de secours, qui consisterait à créer un fichier HTML temporaire et à l'ouvrir automatiquement dans le navigateur internet, mais bon après ça fait peut-être pas très propre... Mais si ça peut fonctionner ^^

    Je suis ouvert à tout axe de recherche !!

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Consultant BI & Web
    Inscrit en
    Juillet 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BI & Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Par défaut Solution trouvée !
    Bon eh bien j'ai trouvé, tout seul, comme un grand

    Merci à plus !

    ..........

    Je plaisante je vais évidemment donner la solution que j'ai trouvé ^^

    Alors voici ce que j'ai fait :


    Mon affichage devant se faire sur la partie cliente (logique...) mon code pour afficher un JFrame que j'avais mis en place côté serveur s'affichait bien évidemment... Sur le serveur xD

    Je partais du principe de ne pas changer le client (VisualVM) afin de laisser aux utilisateurs le maximum de souplesse. Cependant je me suis rendu compte que pour afficher mon tableau HTML afin d'avoir un rendu exploitable (avec des couleurs et tout et tout) j'étais obligé de passer par la modification du client (car JMX ne supporte pas le type JFrame comme type de retour d'une opération).

    Mon opération s'exécutant à partir du plugin MBeans de VisualVM, il a fallu que je trouve le code source de ce dernier afin de lui dire "Attention si tu vois que je te donne du HTML tu me l'affiches dans une JFrame".


    Voici donc ma démarche :



    - Récupérer les sources


    Le lien SVN pour récupérer les sources de VisualVM est le suivant :

    https://svn.java.net/svn/visualvm~sv...hes/release134


    Si comme moi vous avez des soucis avec le client SVN inclut dans NetBeans car vous êtes derrière un proxy, vous pouvez le faire par ligne de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    svn --config-option servers:global:http-proxy-host=MY_PROXY_HOST --config-option servers:global:http-proxy-port=MY_PROXY_PORT checkout https://svn.java.net/svn/visualvm~svn/branches/release134 sources-visualvm
    En vous mettant sur votre dossier de destination bien sûr (cd C:\Utilisateurs\moi\Documents\SourcesVisualVM par exemple).



    - Ajout de la plateforme VisualVM


    NetBeans a besoin de la plateforme VisualVM pour créer des modules (plugins) pour ce dernier. Pour cela, allez dans « Tools » -> « NetBeans Platforms ».

    Cliquez alors sur « Add Platform… » en bas à gauche de la fenêtre et sélectionnez le dossier vers les bin téléchargés à cette adresse : http://visualvm.java.net/download.html


    Vous devriez avoir ceci :





    - Ajout des sources dans le workspace (NetBeansProjects)


    Faites un copier/coller des sources téléchargées (depuis le lien SVN plus haut) vers votre workspace NetBeans (par défaut dans C:\Utilisateurs\XXX\Documents\NetBeansProjects).



    - Ouverture du projet du plugin MBeans


    Dans NetBeans, faites un clic droit dans l’explorateur de projets (ou allez dans le menu “Files”) et cliquez sur “Open Project…”.
    Vous aurez alors une liste des différents projets présents dans votre workspace.
    Ouvrez le projet « mbeans » qui se trouve dans « release134 » -> « plugins », comme ci-dessous :





    - Modification du fichier « platform.properties »


    Pour pouvoir builder votre plugin vous devez définir certaines variables pour votre plateforme.
    Pour cela, ouvrez le fichier platform.properties dans le répertoire release134\plugins\nbproject de votre workspace.
    Remplacez le contenu par (en changeant les chemins par rapport aux vôtres) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cluster.path=\
    	C:\\Program Files\\java6\\visualvm_134\\platform:\
    	C:\\Program Files\\java6\\visualvm_134\\profiler
     
    # Deprecated since 5.0u1; for compatibility with 5.0:
    disabled.clusters=
    nbjdk.active=default
    nbplatform.active=VisualVM_1.3.4
    suite.dir=${basedir}
     
    harness.dir= C:\\Program Files\\NetBeans 7.1.2\\harness


    - Modification de la classe XMBeanOperations


    Afin d'ajouter notre fonctionnalité (affichage d'un tableau HTML), vous devez modifier la classe qui traite les opérations, à savoir la classe XMBeanOperations dans le package com.sun.tools.visualvm.modules.mbeans.

    A la ligne 173, remplacez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (entryIf.getReturnType() != null &&
                                !entryIf.getReturnType().equals(Void.TYPE.getName()) &&
                                !entryIf.getReturnType().equals(Void.class.getName()))
                            fireChangedNotification(OPERATION_INVOCATION_EVENT, button, result);
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if (entryIf.getReturnType() != null &&
                                !entryIf.getReturnType().equals(Void.TYPE.getName()) &&
                                !entryIf.getReturnType().equals(Void.class.getName())) {
                            if (entryIf.getReturnType() instanceof String) {
                                String res = result + "";
                                if (res.indexOf("<html>") != -1) {
                                    JFrame frame = displayHTMLJFrame(res, button.getText());
                                    frame.setVisible(true);
                                }
                                else
                                    fireChangedNotification(OPERATION_INVOCATION_EVENT, button, result);
                            } else
                                fireChangedNotification(OPERATION_INVOCATION_EVENT, button, result);
                        }

    Avec la méthode de création de la JFrame que vous placez au dessus de "void performInvokeRequest(final JButton button)" par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        // Affiche une fenetre avec le code HTML interprete qu'on lui donne en argument
        public JFrame displayHTMLJFrame(String HTML, String title){
                JFrame fen = new JFrame();
            fen.setSize(1000, 800);
            fen.setTitle(title);
     
            JEditorPane pan = new JEditorPane();
            pan.setEditorKit(new HTMLEditorKit());
            pan.setEditable(false);
     
            pan.setText(HTML);
            fen.add(pan);
            return fen;
        }

    On peut donc voir que l'on fait un test déjà sur le type de retour, si c'est un String que l'on renvoie alors on regarde si dans cette chaîne de caractère on a une balise <html>, si c'est le cas, alors on remplace le résultat du clic par l'ouverture d'une JFrame avec le String qu'on met dedans, ce qui nous fait l'affichage de notre code HTML !



    - Création du fichier .nbm


    Le fichier .nbm constitue le fichier de déploiement de votre plugin. Faites simplement un clic droit sur votre projet (dans l’explorateur de projets) et cliquez sur « Create NBM ».
    Votre fichier .nbm se créera dans le dossier « build » à la racine de votre projet.



    - Installation du plugin dans VisualVM


    Pour installer votre plugin, il vous suffit de vous rendre dans VisualVM, d’aller dans « Tools » -> « Plugins », puis dans l’onglet « Downloaded », cliquez sur le bouton « Add Plugins… ». Sélectionnez votre projet au format .nbm puis cliquez sur « Install ». Suivez ensuite les instructions.




    Sources utiles

    http://docs.oracle.com/javase/6/docs...ides/visualvm/
    http://visualvm.java.net/
    http://visualvm.java.net/api-quickstart.html (Créer un plugin VisualVM avec NetBeans)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. quelle différence entre un SGBD serveur et un SGBD
    Par fomazou dans le forum Débuter
    Réponses: 1
    Dernier message: 12/07/2006, 13h15
  2. Comment minimiser le trafic réseau entre appli et serveur ?
    Par delphi+ dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/10/2004, 14h43
  3. [Concept][Définition] Différence entre JDK et SDK
    Par mr-casimir dans le forum Général Java
    Réponses: 5
    Dernier message: 25/05/2004, 12h23
  4. Différence entre SGBD et Serveur d'application
    Par WOLO Laurent dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/06/2003, 08h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo