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."); } }
Partager