Mauvais Descripteur de Fichier IOException en Java à l'aide de javax.xml
Je suis en utilisant le standard javax.xml paquet de parser du XML des fichiers sur une machine linux. Mon code est comme suit:
try
{
//Prepare parser
DocumentBuilder documentBuilder = documentBuilderFactory
.newDocumentBuilder();
Document document = documentBuilder.parse(file.getAbsolutePath()); //This is line 397
XPath xPath = xPathFactory.newXPath();
...
}
catch(IOException e) { ... }
Un seul DocumentBuilderFactory est accessible par plusieurs threads, comme un seul XPathFactory, je pense que c'est acceptable d'utilisation. Je l'occasion de voir l'erreur suivante lors de l'analyse d'un fichier XML à l'aide du code ci-dessus.
java.io.IOException: Bad file descriptor
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:229)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:229)
at java.io.BufferedInputStream.read(BufferedInputStream.java:246)
at org.apache.xerces.impl.XMLEntityManager$RewindableInputStream.read(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at mypackage.MyXmlParser.parseFile(MyXmlParser.java:397)
at mypackage.MyXmlParser.access$500(MyXmlParser.java:51)
at mypackage.MyXmlParser$1.call(MyXmlParser.java:337)
at mypackage.MyXmlParser$1.call(MyXmlParser.java:328)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:284)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:665)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:690)
at java.lang.Thread.run(Thread.java:799)
De temps en temps j' (~10% du temps) voir le texte supplémentaire ci-dessous:
Caused by:
java.io.IOException: Bad file descriptor
at org.apache.xml.serializer.ToStream.flushWriter(ToStream.java:260)
at org.apache.xml.serializer.ToXMLStream.endDocument(ToXMLStream.java:191)
at org.apache.xalan.transformer.TransformerIdentityImpl.endDocument(TransformerIdentityImpl.java:983)
at org.apache.xml.serializer.TreeWalker.traverse(TreeWalker.java:174)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:410)
... 9 more
Quand j'ai inspecter manuellement les fichiers, je ne vois pas de différence entre les fichiers qui échouent et les fichiers qui passent. Je peux confirmer les fichiers qui passent sont XML valide et n'ont pas de caractères spéciaux ou les terminaisons.
Personne ne sait pourquoi ce qui se passe, et comment je peux l'éviter?
> java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pxa64dev-20061002a (SR3) )
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Linux amd64-64 j9vmxa6423-20061001 (JIT enabled)
J9VM - 20060915_08260_LHdSMr
JIT - 20060908_1811_r8
GC - 20060906_AA)
JCL - 20061002
Merci, si c'est le cas, bien que je ne peux pas trouver une raison quelconque. Je ne suis pas de toucher les fichiers en dehors de l'javax.xml le code que j'ai posté ci-dessus.
OriginalL'auteur Ina | 2012-04-23
Vous devez vous connecter pour publier un commentaire.
Il ressemble à un problème de threads simultanés.
L'erreur peut être quelque part à l'extérieur de la codelet qui vous nous montrez. Mais aussi avec DocumentBuilderFactory et XPathFactory je ne suis pas sûr si elles sont thread-safe; il n'est pas mentionné dans la documentation.
Pour un premier test, je vous recommande de mettre tout le code pour l'analyse des fichiers XML en
synchronized {}
clause. Si cela résout votre problème, alors c'est définitivement un multithread problème. Dans ce cas, vous devez trouver la plus petite partie de code qui doivent être synchronisés.OriginalL'auteur Johanna