2013-12-09 29 views
23

Ich verwende abliest Sturm 0.8.1 eingehende Nachrichten aus einer Amazon SQS-Warteschlange und sind immer konsistent Ausnahmen zu lesen, wenn so zu tun:Was verursacht diese Ausnahmen ParseError wenn eine AWS SQS-Warteschlange in meinem Sturm Cluster

2013-12-02 02:21:38 executor [ERROR] 
java.lang.RuntimeException: com.amazonaws.AmazonClientException: Unable to unmarshall response (ParseError at [row,col]:[1,1] 
Message: JAXP00010001: The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK.) 
     at REDACTED.spouts.SqsQueueSpout.handleNextTuple(SqsQueueSpout.java:219) 
     at REDACTED.spouts.SqsQueueSpout.nextTuple(SqsQueueSpout.java:88) 
     at backtype.storm.daemon.executor$fn__3976$fn__4017$fn__4018.invoke(executor.clj:447) 
     at backtype.storm.util$async_loop$fn__465.invoke(util.clj:377) 
     at clojure.lang.AFn.run(AFn.java:24) 
     at java.lang.Thread.run(Thread.java:701) 
Caused by: com.amazonaws.AmazonClientException: Unable to unmarshall response (ParseError at [row,col]:[1,1] 
Message: JAXP00010001: The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK.) 
     at com.amazonaws.http.AmazonHttpClient.handleResponse(AmazonHttpClient.java:524) 
     at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:298) 
     at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:167) 
     at com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:812) 
     at com.amazonaws.services.sqs.AmazonSQSClient.receiveMessage(AmazonSQSClient.java:575) 
     at REDACTED.spouts.SqsQueueSpout.handleNextTuple(SqsQueueSpout.java:191) 
     ... 5 more 
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] 
Message: JAXP00010001: The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK. 
     at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:219) 
     at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.<init>(XMLStreamReaderImpl.java:189) 
     at com.sun.xml.internal.stream.XMLInputFactoryImpl.getXMLStreamReaderImpl(XMLInputFactoryImpl.java:277) 
     at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLStreamReader(XMLInputFactoryImpl.java:129) 
     at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLEventReader(XMLInputFactoryImpl.java:78) 
     at com.amazonaws.http.StaxResponseHandler.handle(StaxResponseHandler.java:85) 
     at com.amazonaws.http.StaxResponseHandler.handle(StaxResponseHandler.java:41) 
     at com.amazonaws.http.AmazonHttpClient.handleResponse(AmazonHttpClient.java:503) 
     ... 10 more 

Ich habe die Daten in der Warteschlange debugged und alles sieht gut aus. Ich kann nicht herausfinden, warum die XML-Antwort der API diese Probleme verursachen würde. Irgendwelche Ideen?

Antwort

47

Beantworten meiner eigenen Frage hier für die Ewigkeit.

Derzeit gibt es in Oracle und OpenJDKs Java einen Verarbeitungsfehler für die XML-Erweiterungsgrenze, der dazu führt, dass ein gemeinsamer Zähler beim Parsen mehrerer XML-Dokumente die Standardobergrenze erreicht.

  1. https://blogs.oracle.com/joew/entry/jdk_7u45_aws_issue_123
  2. https://bugs.openjdk.java.net/browse/JDK-8028111
  3. https://github.com/aws/aws-sdk-java/issues/123

Obwohl ich dachte, dass unsere Version (6b27-1.12.6-1ubuntu0.12.04.4) war nicht betroffen, da das Ausführen von Beispielcode im OpenJDK-Fehlerbericht hat tatsächlich bestätigt, dass wir für den Fehler anfällig waren.

Um das Problem zu umgehen, musste ich jdk.xml.entityExpansionLimit=0 an die Storm Arbeiter übergeben. Indem ich in meinem Cluster Folgendes zu storm.yaml hinzugefügt habe, konnte ich dieses Problem beheben.

supervisor.childopts: "-Djdk.xml.entityExpansionLimit=0" 
worker.childopts: "-Djdk.xml.entityExpansionLimit=0" 

Ich sollte anmerken, dass dies eröffnet Ihnen technisch bis zu einem Denial-of-Service-Angriff, aber da unsere XML-Dokumente werden nur von SQS kommen, ich bin nicht besorgt über jemand böswillig XML schmieden unsere Arbeiter zu töten.

+0

Es könnte mehr dazu geben. Ich bekomme den gleichen Fehler mit Java6. Ich habe Java7 nirgendwo auf meinem Rechner installiert. – BrianC

+0

P. S. Outstanding Post übrigens. – BrianC

+0

Macht nichts. Dies betrifft auch bestimmte Versionen von Java5, 6, 7 und 8. Sehen Sie dies für Details https://bugs.openjdk.java.net/browse/JDK-8028111 – BrianC