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

Format d'échange (XML, JSON...) Java Discussion :

Erreur "Too many open files" [JAXB]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Erreur "Too many open files"
    Bonjour,

    Tout d'abord, des petites précisions sur le contexte :
    - Librairie utilisée : CastorXML pour sérialiser les XML.
    (J'ai préfixé le post par JAXB mais il se peut que le problème soit inhérent à Castor)
    - Projet maven avec tests unitaires automatisés.
    - Utilisation de Jenkins qui effectue tous les tests après chaque commit.


    Mon problème est le suivant :

    Notre appli web communique avec les clients via un protocole XML.
    Chaque dialogue (transaction) possède un état.
    L'application possède une machine à état pour décider quoi répondre au client à chaque sollicitation.

    Mon problème concerne l'exécution des tests unitaires testant cette machine à état :
    - En local (Sur un poste windows), ces tests s’exécutent correctement.
    - Sur la machine où Jenkins est installé (poste linux), les tests s'interrompent en plein milieu et je recois des erreurs du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Caused by: java.io.FileNotFoundException: /var/lib/jenkins/.../UtilsHttpRequest.class (Too many open files)
    	at java.io.FileInputStream.open(Native Method)
    	at java.io.FileInputStream.<init>(FileInputStream.java:106)
    	at sun.misc.URLClassPath$FileLoader$1.getInputStream(URLClassPath.java:1001)
    	at sun.misc.Resource.cachedInputStream(Resource.java:59)


    Après un peu de recherche, il s'averrerait que cela provienne d'un nombre limité de File Descriptors sur les machines Linux.
    J'ai donc essayé de voir où j'ouvre des File Descriptor sans vraiement être sur des les fermer.
    Une de mes pistes concerne les Mashaller / Unmashaller qui ont l'air d'en utiliser :
    J'effectue en effect plus de 400 Marshall / Unmarshall dans l'exécution de mes tests unitaires.

    Je voudrais donc savoir si ce nombre d'appels prohibitifs peut réellement être source de problème.
    Et si oui, un moyen de contournement. (Si il existe biensur)


    Je joint à la fin de ce post mes deux classes sérialisant et désérialisant les flux.

    Merci d'avance,
    Adrien SCHIEHLE



    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
     
        public static String genererFlux(final PASSTRANS p_xmlElem) throws ExceptionMalformedXML {
     
            final StringWriter writer = new StringWriter();
            String result = null;
            try {
                sMarshaller.setWriter(writer);
                sMarshaller.marshal(p_xmlElem);
                writer.flush();
                result = writer.toString();
                NB_ACCESS++;
            } catch (final Exception e) {
                throw new ExceptionMalformedXML(e.getMessage());
            } finally {
                try {
                    writer.close();
                } catch (final IOException e) {
                    LOGGER.warn("Can't close writer.");
                }
            }
     
            return result;
        }
     
     
        public static PASSTRANS recupererXML(final String p_urlXml,
                final String p_exploitant)
                throws ExceptionVrchMobitransWebMajTopologie {
     
            PASSTRANS tyPasstrans = null;
     
            Reader readerCastor = null;
     
            // Récupération de l'objet PASSTRANS à partir de l'url donné
            try {
                final InputStream inputCastor = new ByteArrayInputStream(p_urlXml
                        .getBytes());
     
                readerCastor = new InputStreamReader(inputCastor);
     
                tyPasstrans = PASSTRANS.unmarshal(readerCastor);
     
                LOGGER.debug("PASSTRANS/TransactionId=<"
                        + tyPasstrans.getTransactionId() + ">");
                NB_ACCESS++;
     
            } catch (final Exception e) {
                throw new ExceptionVrchMobitransWebMajTopologie(e.getMessage(),
                        "Terminal : importCommand()", p_exploitant);
            } finally {
     
                try {
                    if (readerCastor != null) {
                        readerCastor.close();
                    }
                } catch (final IOException e) {
                    LOGGER.warn("Can't close reader.");
                }
            }

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ce n'est pas le nombre d'appel qui va poser problème, mais la quantité de fichiers (streams) qui tu as oublié de fermer.

    Bonne nouvelle, ton test est occupé de te dire que t'as une fuite de descripteurs :p

    Mauvaise nouvelle, faut maintenant la trouver.

    Pour t'aider, je te recommande ceci:

    1) assure toi, en général, que pour tes inputstream / outputstream, tu utilise toujours le schema suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    InputStream input = ouvrir un stream
    try {
      // faire des trucs
    } finally {
      is .close();
    }
    pareil avec les channels et les socket.
    2) pendant le test, après l'erreur, si la jvm tourne toujours, utiliser la commande "lsof" avec le pid de la jvm. Ca te listera les noms de tous les fichiers et descripteurs ouverts par la jvm. Très pratique pour identifier un problème.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Merci pour les informations.

    Cela ne viendrait donc pas de mon marshalling / unmarshalling parfois un peu abusif.

    Il faut donc que je regarde les endroits où j'ouvre des file descriptors sans obligatoirement mettre le close() en fin de méthode

    Normalement j'en ai plus, mais je vais donc refaire une passe.

    Le coup du Mashaller était une fausse piste...

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

Discussions similaires

  1. Erreur Too many open files
    Par lelectronique.com dans le forum Apache
    Réponses: 11
    Dernier message: 27/12/2012, 21h16
  2. Erreur système : Too many open files
    Par AL1986 dans le forum Administration système
    Réponses: 3
    Dernier message: 28/03/2011, 22h10
  3. Too many open files
    Par ppmaster dans le forum Weblogic
    Réponses: 1
    Dernier message: 11/09/2007, 14h17
  4. [Système] failed to open stream: Too many open files
    Par shamanlinks dans le forum Langage
    Réponses: 7
    Dernier message: 23/05/2006, 11h59
  5. Pb avec socket - too many open files
    Par be_tnt dans le forum Réseau
    Réponses: 16
    Dernier message: 17/05/2006, 10h46

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