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

Collection et Stream Java Discussion :

initialiser à vide une map static


Sujet :

Collection et Stream Java

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut initialiser à vide une map static
    Bonjour,

    j'utilise une static HashMap<String, String>() afin de rajouter les codes et libellés pays que je récupère d'une base de données.
    comme il y a la possibilité qu'un pays soit supprimé de la base j'ai besoin d'initialiser la map dans ma méthode et recuperer la nouvelle liste.
    Or la map garde toujours la premiere valeur recuperée de la base meme en utilisant clear() ou new HashMap<String, String>()

    y a moyen de forcer l'initialisation de cette map ?

    Merci.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 615
    Points
    21 615
    Par défaut
    Si, clear() enlève bel et bien toutes les données d'une HashMap, et new HashMap crée bel et bien une nouvelle Map totalement vide.

    Il vaudrait mieux que tu nous montres ton code. Il est clair que tu ne comprends pas ce que tu fais et que tu n'arrives pas à le décrire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut
    Voici la declaration de ma map

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	/** map des devises. */
    	private static Map<String, String> mapDevises = new HashMap<String, String>();
    Dans la meme classe et après recuperation de mes données de la BD.
    que ce soit un clear() ou une nouvelle instanciation de ma map, cette derniere ne se vide pas

    voici la méthode qui alimente ma map

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	public static void alimenterMAp(int nbElements, CommareaOutput output) {
    		mapDevises.clear();
    		mapDecimaleMonde.clear();
    		mapDevisesEurope.clear();
    		for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-DEV", nbElements)) {
    			// final String codeDevise = element.getString("COM-OUT-CODE-INT", true);
    			final String codeIso = element.getString("COM-OUT-CODE-ISO", true);
    			final String nbrDecimale = element.getString("COM-OUT-NB-DECI", true);
    			final String libDevise = element.getString("COM-OUT-LIB-DEV", true);
    			mapDevises.put(codeIso, libDevise);
    			mapDecimaleMonde.put(codeIso, nbrDecimale);
    		}
    	}
    Alors que j'aimerais qu'à la fin des 3 instructions clear() avoir ma map vide pour l'alimenter avec des donnés actualisées.

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut
    la méthode alimenterMAp est appelé une fois après le démarrage du serveur !
    et après chaque 5 minutes pour rafraichir la map.
    mais la map garde toujours la première valeur récupérée au démarrage du serveur.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 615
    Points
    21 615
    Par défaut
    Hum. Puisque tu parles de serveur, j'imagine que tu as donc différents threads : le thread qui démarre l'appli, le pool de threads qui traite les requêtes, et peut-être le thread qui recharge toutes les 5 minutes.

    Auquel cas, effectivement, un thread ne voit pas ce que font les autres threads, et si un thread vide et recharge la Map, les threads qui lisent le contenu de la Map ont de bonnes chances de faire comme si ce n'était jamais arrivé.
    La solution serait de synchroniser l'accès à la Map, pour que tous les threads voient la même chose.
    Mise en œuvre simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static Map<String, String> mapDevises = Collections.synchronizedMap(new HashMap<String, String>());
    Ça force à ce que chaque accès à la Map soit synchronisé, ce qui devrait éliminer le problème dont je parle.

    Ce qui veut dire aussi que ta méthode qui recharge la Map se retrouve à synchroniser chaque accès individuel à la Map, ce qui n'est pas brillant en termes de cohérence ni de performance.
    Du coup il faudrait l'encadrer d'un gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    synchronized(mapDevises) {
      // tout ce qui modifie la map.
    }
    histoire que la totalité du rechargement soit perçue comme atomique par les autres threads, et qu'ils ne puissent pas y accéder au milieu du rechargement.


    Si il se trouve que, finalement, ce n'est pas une histoire de threads, il va falloir montrer le reste du code. Il n'y a rien, là.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut
    Voici le code de toute ma classe !


    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
     
    package com.cl.zqen.services.impl;
     
    import java.util.HashMap;
    import java.util.Map;
     
    import com.cl.fwk.services.cics.CICSService;
    import com.cl.fwk.services.cics.CommareaInput;
    import com.cl.fwk.services.cics.CommareaOutput;
    import com.cl.fwk.services.cics.Transaction;
    import com.cl.fwk.services.log.LogService;
    import com.cl.zqen.services.ListesParametrablesTPService;
     
    /**
     * récupération de liste de couple "code,libellé". utilisée pour alimenter des combo box, mais aussi le libellé d'une donnée dont on ne connait que le code.
     * 
     * @author TAHIR_A
     */
    public class ListesParametrablesTPServiceImpl implements ListesParametrablesTPService {
     
    	/** etat du lancement de la tache. */
    	private boolean isRunnedOneTime = false;
     
    	/** map des devises. */
    	private static Map<String, String> mapDevises = new HashMap<String, String>();
     
    	/** map decimale monde. */
    	private static Map<String, String> mapDecimaleMonde = new HashMap<String, String>();
     
    	/** map devises europe. */
    	private static Map<String, String> mapDevisesEurope = new HashMap<String, String>();
     
    	/** map pays. */
    	private static Map<String, String> mapPays = new HashMap<String, String>();
     
    	/** map pays code interne. */
    	private static Map<String, String> mapPaysCodeInterne = new HashMap<String, String>();
     
    	/** map pays europe. */
    	private static Map<String, String> mapPaysEurope = new HashMap<String, String>();
     
    	/** map pays restrints. */
    	private static Map<String, String> mapPaysRestreints = new HashMap<String, String>();
     
    	/** Handler du service de log. */
    	private LogService log;
     
    	/** Handler sur le service CICS. */
    	private CICSService cics;
     
    	/**
             * @return the mapPays
             */
    	public static Map<String, String> getMapPays() {
    		return mapPays;
    	}
     
    	/**
             * @param mapPays the mapPays to set
             */
    	public static void setMapPays(Map<String, String> mapPays) {
    		ListesParametrablesTPServiceImpl.mapPays = mapPays;
    	}
     
    	/**
             * @return the mapPaysCodeInterne
             */
    	public static Map<String, String> getMapPaysCodeInterne() {
    		return mapPaysCodeInterne;
    	}
     
    	/**
             * @param mapPaysCodeInterne the mapPaysCodeInterne to set
             */
    	public static void setMapPaysCodeInterne(Map<String, String> mapPaysCodeInterne) {
    		ListesParametrablesTPServiceImpl.mapPaysCodeInterne = mapPaysCodeInterne;
    	}
     
    	/**
             * @return the mapPaysEurope
             */
    	public static Map<String, String> getMapPaysEurope() {
    		return mapPaysEurope;
    	}
     
    	/**
             * @param mapPaysEurope the mapPaysEurope to set
             */
    	public static void setMapPaysEurope(Map<String, String> mapPaysEurope) {
    		ListesParametrablesTPServiceImpl.mapPaysEurope = mapPaysEurope;
    	}
     
    	/**
             * @return the mapPays
             */
    	public static Map<String, String> getMapPaysRestreints() {
    		return mapPaysRestreints;
    	}
     
    	/**
             * @param mapPaysRestreints the mapPaysRestreints to set
             */
    	public static void setMapPaysRestreints(Map<String, String> mapPaysRestreints) {
    		ListesParametrablesTPServiceImpl.mapPaysRestreints = mapPaysRestreints;
    	}
     
    	/**
             * @return the mapDevises
             */
    	public static Map<String, String> getMapDevises() {
    		return mapDevises;
    	}
     
    	/**
             * @param mapDevises the mapDevises to set
             */
    	public static void setMapDevises(Map<String, String> mapDevises) {
    		ListesParametrablesTPServiceImpl.mapDevises = mapDevises;
    	}
     
    	/**
             * @return the mapDevisesEurope
             */
    	public static Map<String, String> getMapDevisesEurope() {
    		return mapDevisesEurope;
    	}
     
    	/**
             * @param mapDevisesEurope the mapDevisesEurope to set
             */
    	public static void setMapDevisesEurope(Map<String, String> mapDevisesEurope) {
    		ListesParametrablesTPServiceImpl.mapDevisesEurope = mapDevisesEurope;
    	}
     
    	/**
             * @return the mapDecimaleMonde
             */
    	public static Map<String, String> getMapDecimaleMonde() {
    		return mapDecimaleMonde;
    	}
     
    	/**
             * @param mapDecimaleMonde the mapDecimaleMonde to set
             */
    	public static void setMapDecimaleMonde(Map<String, String> mapDecimaleMonde) {
    		ListesParametrablesTPServiceImpl.mapDecimaleMonde = mapDecimaleMonde;
    	}
     
    	/**
             * {@inheritDoc}
             */
    	public boolean runned() {
    		return mapDevises != null && mapDevises.size() > 0;
    	}
     
    	/**
             * @param cics the cics to set .
             */
    	public void setCics(final CICSService cics) {
    		this.cics = cics;
    	}
     
    	/**
             * Setter du service LOG.
             * 
             * @param log : le service LOG a setter.
             */
    	public void setLog(final LogService log) {
    		this.log = log;
    	}
     
    	/**
             * mise à jour de la liste des codes bloopés ainsi que l'état bloqué du site.
             * 
             */
    	public void run() {
    		manageCodesPays();
    		manageCodesDevises();
    	}
     
    	/**
             * 
             */
    	private void manageCodesPays() {
     
    		try {
    			mapDevises.clear();
    			mapDecimaleMonde.clear();
    			mapDevisesEurope.clear();
     
    			// obtention de la transaction
    			final Transaction transaction = cics.getTransaction("H3DV");
    			// creation de la commarea d'entrée
    			final CommareaInput input = transaction.createInput();
    			// appel métier
    			final CommareaOutput output = transaction.execute(input);
    			final String numErr = output.getString("COM-ENTETE-APPLI-CODE-RET", true);
    			if (!numErr.equals("")) {
    				log.debug(this.getClass().getName() + " -> ERREUR BLOQUANTE CICS service " + output.getProgramme() + ". Numero : [" + numErr + "].");
    			} else {
    				final int nbElements = output.getShort("COM-OUT-NB-DEV");
    				// for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-DEV", nbElements)) {
    				// // final String codeDevise = element.getString("COM-OUT-CODE-INT", true);
    				// final String codeIso = element.getString("COM-OUT-CODE-ISO", true);
    				// final String nbrDecimale = element.getString("COM-OUT-NB-DECI", true);
    				// final String libDevise = element.getString("COM-OUT-LIB-DEV", true);
    				// mapDevises.put(codeIso, libDevise);
    				// mapDecimaleMonde.put(codeIso, nbrDecimale);
    				alimenterMAp(nbElements, output);
    				// }
    				// parcours de la liste devises europe
    				final int nbElementsEurope = output.getShort("COM-OUT-NB-DEV-EUR");
    				// récupération de la liste des elements
    				for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-DEV-EUR", nbElementsEurope)) {
    					final String codeIso = element.getString("COM-OUT-CODE-ISO-EUR", true);
    					final String libDevise = element.getString("COM-OUT-LIB-DEV-EUR", true);
    					mapDevisesEurope.put(codeIso, libDevise);
    				}
    				// changement d'état du service : il a été lancé
    				if (!isRunnedOneTime) {
    					isRunnedOneTime = true;
    				}
    			}
    		} catch (Exception e) {
    			log.critical(9003, e, "H3H3DVP  : Erreur de récupération de la liste des codes devises");
    		}
    	}
     
    	/**
             * 
             */
     
    	private void manageCodesDevises() {
     
    		try {
    			mapPays.clear();
    			mapPaysCodeInterne.clear();
    			mapPaysEurope.clear();
    			mapPaysRestreints.clear();
    			// obtention de la transaction
    			final Transaction transaction = cics.getTransaction("H3PY");
    			// creation de la commarea d'entrée
    			final CommareaInput input = transaction.createInput();
    			// appel métier
    			final CommareaOutput output = transaction.execute(input);
     
    			final String numErr = output.getString("COM-ENTETE-APPLI-CODE-RET", true);
    			// final String msgErr = output.getString("COM-ENTETE-APPLI-CODE-MSG");
    			if (!numErr.equals("")) {
    				log.debug(this.getClass().getName() + " -> ERREUR BLOQUANTE CICS service " + output.getProgramme() + ". Numero : [" + numErr + "].");
    			} else {
    				// parcours de la liste
    				final int nbElements = output.getShort("COM-OUT-NB-PAYS");
    				// récupération de la liste des elements
    				output.getArray("COM-OUT-LISTE-PAYS");
    				for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-PAYS", nbElements)) {
    					final String codePays = element.getString("COM-OUT-CODE-INT", true);
    					final String codeIso = element.getString("COM-OUT-CODE-ISO2", true);
    					final String libPays = element.getString("COM-OUT-LIB-PAYS", true);
    					mapPays.put(codeIso, libPays);
    					mapPaysCodeInterne.put(codePays, libPays);
    				}
     
    				final int nbElementsEurope = output.getShort("COM-OUT-NB-PAYS-EUR");
    				// récupération de la liste des elements
    				for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-PAYS-EUR", nbElementsEurope)) {
    					final String codePays = element.getString("COM-OUT-CODE-ISO2-EUR", true);
    					final String libPays = element.getString("COM-OUT-LIB-PAYS-EUR", true);
    					mapPaysEurope.put(codePays, libPays);
    				}
     
    				final int nbElementsRestreints = output.getShort("COM-OUT-NB-PAYS-RES");
    				// récupération de la liste des elements
    				for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-RES", nbElementsRestreints)) {
    					final String codePays = element.getString("COM-OUT-CODE-ISO2-RES", true);
    					final String libPays = element.getString("COM-OUT-LIB-PAYS-RES", true);
    					mapPaysRestreints.put(codePays, libPays);
    				}
    				// changement d'état du service : il a été lancé
    				if (!isRunnedOneTime) {
    					isRunnedOneTime = true;
    				}
    			}
    		} catch (Exception e) {
    			log.critical(9003, e, "H3H3PYP  : Erreur de récupération de la liste des codes pays");
    		}
    	}
     
    	synchronized public static void alimenterMAp(int nbElements, CommareaOutput output) {
    		mapDevises = new HashMap<String, String>();
    		mapDecimaleMonde = new HashMap<String, String>();
    		for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-DEV", nbElements)) {
    			// final String codeDevise = element.getString("COM-OUT-CODE-INT", true);
    			final String codeIso = element.getString("COM-OUT-CODE-ISO", true);
    			final String nbrDecimale = element.getString("COM-OUT-NB-DECI", true);
    			final String libDevise = element.getString("COM-OUT-LIB-DEV", true);
    			mapDevises.put(codeIso, libDevise);
    			mapDecimaleMonde.put(codeIso, nbrDecimale);
    		}
     
    	}
    }
    et un exemple d'appel d'une de ces Map

    [code]
    Map<String, String> mapDecimaleMonde = ListesParametrablesTPServiceImpl.getMapDecimaleMonde();
    [code]

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut
    Non ça marche pas meme avec la synchronisation les liste ne se vident pas .

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Dans ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    synchronized public static void alimenterMAp(int nbElements, CommareaOutput output) {
    		mapDevises = new HashMap<String, String>();
    		mapDecimaleMonde = new HashMap<String, String>();
    ...
    }
    tu crées de nouvelles instances de map (méthode appelée indirectement par run()/manageCodePays()). Si une classe utilise l'une des maps en ayant obtenu son instance par un des getters, il continue à utiliser cette instance et pas la nouvelle, et donc accède aux anciennes valeurs forcément.

    Ne recrées pas de nouvelle instance et utilises uniquement clear() pour réinitialiser l'instance unique. Ou alors, il faut récupérer systématiquement la dernière instance de map à chaque fois qu'on a besoin de récupérer une de ses valeurs (val = ListesParametrablesTPServiceImpl.getMapDecimaleMonde().get(key)), ou fournir des méthodes, synchronized, qui cachent la map (genre getDecimalMonde(String key)), mieux à mon avis.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Points : 19
    Points
    19
    Par défaut
    Au niveau architecture de ta classe c'est étrange je comprends pas très bien l’intérêt de ton interface pour une classe qui a presque que des méthodes statiques.

    Tes opérations de modification ne sont pas bien synchronisés car seul ta méthode "alimenterMAp" l'est. Tu devrais peut être remonter ton bloc de synchro dans ta méthode "run".

    Ensuite les accès en lecture ne sont non plus pas synchronisés, tu pourras te retrouver a un moment avec des maps vides ou incomplètes.

    Sinon je rejoints ce qui a été dis plus haut. N'expose pas tes map directement, mais plutot leurs valeurs.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,

    Dans ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    synchronized public static void alimenterMAp(int nbElements, CommareaOutput output) {
    		mapDevises = new HashMap<String, String>();
    		mapDecimaleMonde = new HashMap<String, String>();
    ...
    }
    tu crées de nouvelles instances de map (méthode appelée indirectement par run()/manageCodePays()). Si une classe utilise l'une des maps en ayant obtenu son instance par un des getters, il continue à utiliser cette instance et pas la nouvelle, et donc accède aux anciennes valeurs forcément.

    Ne recrées pas de nouvelle instance et utilises uniquement clear() pour réinitialiser l'instance unique. Ou alors, il faut récupérer systématiquement la dernière instance de map à chaque fois qu'on a besoin de récupérer une de ses valeurs (val = ListesParametrablesTPServiceImpl.getMapDecimaleMonde().get(key)), ou fournir des méthodes, synchronized, qui cachent la map (genre getDecimalMonde(String key)), mieux à mon avis.

    synchronized est ajouté au niveau de la méthode run et manageCodesDevises.
    l'utilisation de clear() ne change rien et les map reste alimentées.
    en fait ça fonctionne en mode annule / remplace et on a besoin de toute la liste en un seul coup et en aucun cas on recupere valeur par valeur.

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 615
    Points
    21 615
    Par défaut
    Citation Envoyé par freestyler1982 Voir le message
    synchronized est ajouté au niveau de la méthode run et manageCodesDevises.
    synchronized n'est pas une formule magique et doit être utilisé de la bonne manière, par exemple comme j'ai montré.
    Si les Maps doivent être conservées par les services utilisateurs mais qu'elles peuvent être modifiées/rechargées, alors elles doivent être synchronisées individuellement. Et peut-être que ce n'est pas ce que tu fais.
    Par ailleurs, "toute la liste en un seul coup" ça n'existe pas. Une Map ou une List, c'est composé de ce qu'elle contient, c'est pas "en un seul coup." Si tu veux qu'une action se passe "comme si c'était en un seul coup," cette action doit être synchronisée dans son intégralité. Soit en l'encadrant d'un synchronized, soit en faisant juste une copie de la Map (et faire cette copie doit être encadré de synchronized) et en utilisant cette copie pendant l'action.

    Donc, arrête de dire des choses sans montrer le code. Il faut toujours montrer le code. L'idée même de ne pas le faire n'a jamais eu le moindre sens.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut
    on s'est mal compris je pense "en un seul coup" je voulais dire par cela que dans l'utilisation applicative je recupere pas un seul élément de la map mais toute la map pour alimenter une Select.
    pour le code au dessus j'ai mis toute la classe gerant les map et un exemple d'appel dans une classe controller.

    je remontre le code :

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
     
    package com.cl.zqen.services.impl;
     
    import java.util.HashMap;
    import java.util.Map;
     
    import com.cl.fwk.services.cics.CICSService;
    import com.cl.fwk.services.cics.CommareaInput;
    import com.cl.fwk.services.cics.CommareaOutput;
    import com.cl.fwk.services.cics.Transaction;
    import com.cl.fwk.services.log.LogService;
    import com.cl.zqen.services.ListesParametrablesTPService;
     
    /**
     * récupération de liste de couple "code,libellé". utilisée pour alimenter des combo box, mais aussi le libellé d'une donnée dont on ne connait que le code.
     * 
     * @author TAHIR_A
     */
    public class ListesParametrablesTPServiceImpl implements ListesParametrablesTPService {
     
    	/** etat du lancement de la tache. */
    	private boolean isRunnedOneTime = false;
     
    	/** map des devises. */
    	private static Map<String, String> mapDevises = new HashMap<String, String>();
     
    	/** map decimale monde. */
    	private static Map<String, String> mapDecimaleMonde = new HashMap<String, String>();
     
    	/** map devises europe. */
    	private static Map<String, String> mapDevisesEurope = new HashMap<String, String>();
     
    	/** map pays. */
    	private static Map<String, String> mapPays = new HashMap<String, String>();
     
    	/** map pays code interne. */
    	private static Map<String, String> mapPaysCodeInterne = new HashMap<String, String>();
     
    	/** map pays europe. */
    	private static Map<String, String> mapPaysEurope = new HashMap<String, String>();
     
    	/** map pays restrints. */
    	private static Map<String, String> mapPaysRestreints = new HashMap<String, String>();
     
    	/** Handler du service de log. */
    	private LogService log;
     
    	/** Handler sur le service CICS. */
    	private CICSService cics;
     
    	/**
             * @return the mapPays
             */
    	public static Map<String, String> getMapPays() {
    		return mapPays;
    	}
     
    	/**
             * @param mapPays the mapPays to set
             */
    	public static void setMapPays(Map<String, String> mapPays) {
    		ListesParametrablesTPServiceImpl.mapPays = mapPays;
    	}
     
    	/**
             * @return the mapPaysCodeInterne
             */
    	public static Map<String, String> getMapPaysCodeInterne() {
    		return mapPaysCodeInterne;
    	}
     
    	/**
             * @param mapPaysCodeInterne the mapPaysCodeInterne to set
             */
    	public static void setMapPaysCodeInterne(Map<String, String> mapPaysCodeInterne) {
    		ListesParametrablesTPServiceImpl.mapPaysCodeInterne = mapPaysCodeInterne;
    	}
     
    	/**
             * @return the mapPaysEurope
             */
    	public static Map<String, String> getMapPaysEurope() {
    		return mapPaysEurope;
    	}
     
    	/**
             * @param mapPaysEurope the mapPaysEurope to set
             */
    	public static void setMapPaysEurope(Map<String, String> mapPaysEurope) {
    		ListesParametrablesTPServiceImpl.mapPaysEurope = mapPaysEurope;
    	}
     
    	/**
             * @return the mapPays
             */
    	public static Map<String, String> getMapPaysRestreints() {
    		return mapPaysRestreints;
    	}
     
    	/**
             * @param mapPaysRestreints the mapPaysRestreints to set
             */
    	public static void setMapPaysRestreints(Map<String, String> mapPaysRestreints) {
    		ListesParametrablesTPServiceImpl.mapPaysRestreints = mapPaysRestreints;
    	}
     
    	/**
             * @return the mapDevises
             */
    	public static Map<String, String> getMapDevises() {
    		return mapDevises;
    	}
     
    	/**
             * @param mapDevises the mapDevises to set
             */
    	public static void setMapDevises(Map<String, String> mapDevises) {
    		ListesParametrablesTPServiceImpl.mapDevises = mapDevises;
    	}
     
    	/**
             * @return the mapDevisesEurope
             */
    	public static Map<String, String> getMapDevisesEurope() {
    		return mapDevisesEurope;
    	}
     
    	/**
             * @param mapDevisesEurope the mapDevisesEurope to set
             */
    	public static void setMapDevisesEurope(Map<String, String> mapDevisesEurope) {
    		ListesParametrablesTPServiceImpl.mapDevisesEurope = mapDevisesEurope;
    	}
     
    	/**
             * @return the mapDecimaleMonde
             */
    	public static Map<String, String> getMapDecimaleMonde() {
    		return mapDecimaleMonde;
    	}
     
    	/**
             * @param mapDecimaleMonde the mapDecimaleMonde to set
             */
    	public static void setMapDecimaleMonde(Map<String, String> mapDecimaleMonde) {
    		ListesParametrablesTPServiceImpl.mapDecimaleMonde = mapDecimaleMonde;
    	}
     
    	/**
             * {@inheritDoc}
             */
    	public boolean runned() {
    		return mapDevises != null && mapDevises.size() > 0;
    	}
     
    	/**
             * @param cics the cics to set .
             */
    	public void setCics(final CICSService cics) {
    		this.cics = cics;
    	}
     
    	/**
             * Setter du service LOG.
             * 
             * @param log : le service LOG a setter.
             */
    	public void setLog(final LogService log) {
    		this.log = log;
    	}
     
    	/**
             * mise à jour de la liste des codes bloopés ainsi que l'état bloqué du site.
             * 
             */
    	synchronized public void run() {
    		manageCodesPays();
    		manageCodesDevises();
    	}
     
    	/**
             * 
             */
    	synchronized private void manageCodesPays() {
     
    		try {
    			// obtention de la transaction
    			final Transaction transaction = cics.getTransaction("H3DV");
    			// creation de la commarea d'entrée
    			final CommareaInput input = transaction.createInput();
    			// appel métier
    			final CommareaOutput output = transaction.execute(input);
    			final String numErr = output.getString("COM-ENTETE-APPLI-CODE-RET", true);
    			if (!numErr.equals("")) {
    				log.debug(this.getClass().getName() + " -> ERREUR BLOQUANTE CICS service " + output.getProgramme() + ". Numero : [" + numErr + "].");
    			} else {
    				final int nbElements = output.getShort("COM-OUT-NB-DEV");
    				// for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-DEV", nbElements)) {
    				// // final String codeDevise = element.getString("COM-OUT-CODE-INT", true);
    				// final String codeIso = element.getString("COM-OUT-CODE-ISO", true);
    				// final String nbrDecimale = element.getString("COM-OUT-NB-DECI", true);
    				// final String libDevise = element.getString("COM-OUT-LIB-DEV", true);
    				// mapDevises.put(codeIso, libDevise);
    				// mapDecimaleMonde.put(codeIso, nbrDecimale);
    				alimenterMAp(nbElements, output);
    				// }
    				// parcours de la liste devises europe
    				final int nbElementsEurope = output.getShort("COM-OUT-NB-DEV-EUR");
    				// récupération de la liste des elements
    				for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-DEV-EUR", nbElementsEurope)) {
    					final String codeIso = element.getString("COM-OUT-CODE-ISO-EUR", true);
    					final String libDevise = element.getString("COM-OUT-LIB-DEV-EUR", true);
    					mapDevisesEurope.put(codeIso, libDevise);
    				}
    				// changement d'état du service : il a été lancé
    				if (!isRunnedOneTime) {
    					isRunnedOneTime = true;
    				}
    			}
    		} catch (Exception e) {
    			log.critical(9003, e, "H3H3DVP  : Erreur de récupération de la liste des codes devises");
    		}
    	}
     
    	/**
             * 
             */
     
    	synchronized private void manageCodesDevises() {
     
    		try {
     
    			// obtention de la transaction
    			final Transaction transaction = cics.getTransaction("H3PY");
    			// creation de la commarea d'entrée
    			final CommareaInput input = transaction.createInput();
    			// appel métier
    			final CommareaOutput output = transaction.execute(input);
     
    			final String numErr = output.getString("COM-ENTETE-APPLI-CODE-RET", true);
    			// final String msgErr = output.getString("COM-ENTETE-APPLI-CODE-MSG");
    			if (!numErr.equals("")) {
    				log.debug(this.getClass().getName() + " -> ERREUR BLOQUANTE CICS service " + output.getProgramme() + ". Numero : [" + numErr + "].");
    			} else {
    				// parcours de la liste
    				final int nbElements = output.getShort("COM-OUT-NB-PAYS");
    				// récupération de la liste des elements
    				output.getArray("COM-OUT-LISTE-PAYS");
    				for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-PAYS", nbElements)) {
    					final String codePays = element.getString("COM-OUT-CODE-INT", true);
    					final String codeIso = element.getString("COM-OUT-CODE-ISO2", true);
    					final String libPays = element.getString("COM-OUT-LIB-PAYS", true);
    					mapPays.put(codeIso, libPays);
    					mapPaysCodeInterne.put(codePays, libPays);
    				}
     
    				final int nbElementsEurope = output.getShort("COM-OUT-NB-PAYS-EUR");
    				// récupération de la liste des elements
    				for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-PAYS-EUR", nbElementsEurope)) {
    					final String codePays = element.getString("COM-OUT-CODE-ISO2-EUR", true);
    					final String libPays = element.getString("COM-OUT-LIB-PAYS-EUR", true);
    					mapPaysEurope.put(codePays, libPays);
    				}
     
    				final int nbElementsRestreints = output.getShort("COM-OUT-NB-PAYS-RES");
    				// récupération de la liste des elements
    				for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-RES", nbElementsRestreints)) {
    					final String codePays = element.getString("COM-OUT-CODE-ISO2-RES", true);
    					final String libPays = element.getString("COM-OUT-LIB-PAYS-RES", true);
    					mapPaysRestreints.put(codePays, libPays);
    				}
    				// changement d'état du service : il a été lancé
    				if (!isRunnedOneTime) {
    					isRunnedOneTime = true;
    				}
    			}
    		} catch (Exception e) {
    			log.critical(9003, e, "H3H3PYP  : Erreur de récupération de la liste des codes pays");
    		}
    	}
     
    	synchronized public static void alimenterMAp(int nbElements, CommareaOutput output) {
    		mapDevises.clear();
    		mapDecimaleMonde.clear();
    		for (final CommareaOutput element : output.getArray("COM-OUT-LISTE-DEV", nbElements)) {
    			// final String codeDevise = element.getString("COM-OUT-CODE-INT", true);
    			final String codeIso = element.getString("COM-OUT-CODE-ISO", true);
    			final String nbrDecimale = element.getString("COM-OUT-NB-DECI", true);
    			final String libDevise = element.getString("COM-OUT-LIB-DEV", true);
    			mapDevises.put(codeIso, libDevise);
    			mapDecimaleMonde.put(codeIso, nbrDecimale);
    		}
     
    	}
    }

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/12/2011, 14h46
  2. Initialisation d'une map
    Par Pierre de Siorac dans le forum Langage
    Réponses: 12
    Dernier message: 26/08/2011, 02h35
  3. Initialisation d'itérateur sur une map vide
    Par Pitu45 dans le forum SL & STL
    Réponses: 2
    Dernier message: 18/09/2009, 11h32
  4. initialisation d'une map et d'un iterator
    Par petitmic dans le forum C++
    Réponses: 2
    Dernier message: 12/04/2006, 23h22
  5. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57

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