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

Servlets/JSP Java Discussion :

[Bundle][i18N] forcer le reload d'un ResourceBundleProperties [FAQ]


Sujet :

Servlets/JSP Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 7
    Points
    7
    Par défaut [Bundle][i18N] forcer le reload d'un ResourceBundleProperties
    Bonjour

    Dans une application J2EE (1.3) j'utilise des fichiers ".properties" et des Classe RessourcesBundle pour l'internationalisation (exemple: taglib i18n de jakarta ...)
    Comment faire lorsque l'on modifie un des fichier .properties pour que cette modification soit prise en compte sans avoir à redémarer l'EAR ou la JVM ?
    (En gros je cherche à recharger dynamiquement un RessourceBundle en forçant la relecture du fichier properties correspondant).

    merci de m'éclairer de vos lumières [/code][/quote]

  2. #2
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    BasePropertyMessageResources propMsg=(BasePropertyMessageResources)request.getSession().getServletContext().getAttribute("org.apache.struts.action.MESSAGE");
    			propMsg.reset();
    Ca c'est avec struts, maintenant le problème c'est de savoir si chez toi le nom du bundle est le même
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Bonjour,

    Il me semble que cela ne suffit pas...
    Le classLoader garde une image des fichiers properties en mémoire.

    J'ai trouvé ce code pour remttre à zéro l'image des fichiers en mémoire :
    Je ne sais plus qui est l'auteur (c'est mal )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    /**
         * Recharge tout les bundles
         */
        public boolean reloadBundles() {
            boolean ret = false;
            try {
                clearMap(ResourceBundle.class, null, "cacheList");
     
                // now, for the true and utter hack, if we're running in tomcat,
                // clear
                // it's class loader resource cache as well.
                ret = clearTomcatCache();
            } catch (Exception e) {
                if (LOG.isErrorEnabled()) {
                    LOG.error("Could not reload resource bundles", e);
                }
            }
            return ret;
        }
     
        /**
         * Efface le cache (les ressources) du classLoader de Tomcat
         */
        private boolean clearTomcatCache() {
            boolean ret = false;
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            // no need for compilation here.
            Class cl = loader.getClass();
     
            try {
                if ("org.apache.catalina.loader.WebappClassLoader".equals(cl.getName())) {
                    clearMap(cl, loader, "resourceEntries");
                } else {
                    if (LOG.isWarnEnabled()) {
                        LOG.warn("class loader " + cl.getName()
                                + " is not tomcat loader.");
                    }
                }
                ret = true;
            } catch (Exception e) {
                if (LOG.isErrorEnabled()) {
                    LOG.error("couldn't clear tomcat cache", e);
                }
            }
            return ret;
        }
     
     
        private void clearMap(Class cl, Object obj, String name)
                throws NoSuchFieldException, IllegalAccessException,
                NoSuchMethodException, InvocationTargetException {
            Field field = cl.getDeclaredField(name);
            field.setAccessible(true);
     
            Object cache = field.get(obj);
            Class ccl = cache.getClass();
            Method sizeMethod = ccl.getMethod("size", (Class[]) null);
            if (LOG.isInfoEnabled()) {
                LOG.info(name + ": size before clear: "
                        + sizeMethod.invoke(cache, (Object[]) null));
            }
            Method clearMethod = ccl.getMethod("clear", (Class[]) null);
            clearMethod.invoke(cache, (Object[]) null);
            if (LOG.isInfoEnabled()) {
                LOG.info(name + ": size after clear: "
                        + sizeMethod.invoke(cache, (Object[]) null));
            }
        }
    Moi j'utilise ce code ET je reset les ResourceBundle de Struts. Comme ça je suis sur (et ça marche mais ya pe plus simple je suis preneur dans ce cas).

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Super ça marche !
    Merci

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Bonjour a tous,

    j'aurai voulu savoir si vous connaissiez un moyen de reloader un seul properties et non pas l'ensemble du RessourceBundle.

    Je travaille sur une grosse application et pour des raisons de performances je ne peux pas tout reloader à chaque fois....

    Merci du coup de main

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par gailuris Voir le message
    Bonjour,

    Il me semble que cela ne suffit pas...
    Le classLoader garde une image des fichiers properties en mémoire.

    J'ai trouvé ce code pour remttre à zéro l'image des fichiers en mémoire :
    Je ne sais plus qui est l'auteur (c'est mal )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    /**
         * Recharge tout les bundles
         */
        public boolean reloadBundles() {
            boolean ret = false;
            try {
                clearMap(ResourceBundle.class, null, "cacheList");
     
                // now, for the true and utter hack, if we're running in tomcat,
                // clear
                // it's class loader resource cache as well.
                ret = clearTomcatCache();
            } catch (Exception e) {
                if (LOG.isErrorEnabled()) {
                    LOG.error("Could not reload resource bundles", e);
                }
            }
            return ret;
        }
     
        /**
         * Efface le cache (les ressources) du classLoader de Tomcat
         */
        private boolean clearTomcatCache() {
            boolean ret = false;
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            // no need for compilation here.
            Class cl = loader.getClass();
     
            try {
                if ("org.apache.catalina.loader.WebappClassLoader".equals(cl.getName())) {
                    clearMap(cl, loader, "resourceEntries");
                } else {
                    if (LOG.isWarnEnabled()) {
                        LOG.warn("class loader " + cl.getName()
                                + " is not tomcat loader.");
                    }
                }
                ret = true;
            } catch (Exception e) {
                if (LOG.isErrorEnabled()) {
                    LOG.error("couldn't clear tomcat cache", e);
                }
            }
            return ret;
        }
     
     
        private void clearMap(Class cl, Object obj, String name)
                throws NoSuchFieldException, IllegalAccessException,
                NoSuchMethodException, InvocationTargetException {
            Field field = cl.getDeclaredField(name);
            field.setAccessible(true);
     
            Object cache = field.get(obj);
            Class ccl = cache.getClass();
            Method sizeMethod = ccl.getMethod("size", (Class[]) null);
            if (LOG.isInfoEnabled()) {
                LOG.info(name + ": size before clear: "
                        + sizeMethod.invoke(cache, (Object[]) null));
            }
            Method clearMethod = ccl.getMethod("clear", (Class[]) null);
            clearMethod.invoke(cache, (Object[]) null);
            if (LOG.isInfoEnabled()) {
                LOG.info(name + ": size after clear: "
                        + sizeMethod.invoke(cache, (Object[]) null));
            }
        }
    Moi j'utilise ce code ET je reset les ResourceBundle de Struts. Comme ça je suis sur (et ça marche mais ya pe plus simple je suis preneur dans ce cas).
    l appel de la méthode reloadBundles() se fait dans la servelet apres modification du fichier ressources ou bien dans la jsp.
    j ai essayé les deux et ca marche pas pour moi

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 146
    Points : 84
    Points
    84
    Par défaut
    Bonjour,

    j'essaye en vain de mettre en place la solution proposée mais cela n'a pas l'air de fonctionner.
    Je travaille avec Tomcat.

    Il y aurait-il un paramétrage qui pourrait bloquer le reload des ResourceBundle?

    En débug je vois bien que le resourceEntries se vide mais lors du rechargement les modifications appliquées au fichier ne sont toujours pas prises en compte...

    Pouvez-vous m'aider?

    Merci d'avance

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/10/2014, 04h08
  2. Réponses: 2
    Dernier message: 29/02/2012, 16h37
  3. Forcer le reload d'un Flash
    Par startx25 dans le forum Flash
    Réponses: 1
    Dernier message: 10/08/2010, 17h22
  4. Maven : OSGI, bundles et projet multi-modules reloaded
    Par Patriarch24 dans le forum Maven
    Réponses: 1
    Dernier message: 18/12/2008, 11h53
  5. forcer un reload
    Par amarcil dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/04/2006, 17h19

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