2013-12-09 22 views
23

Używam Burza 0.8.1 czytać przychodzące wiadomości akcję kolejce Amazon SQS i otrzymuję spójnych wyjątki, gdy robi tak:Co jest przyczyną tych wyjątków ParseError gdy odczyt kolejki AWS SQS w moim zestawie przejaśnienia

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 

Mam debugowane dane w kolejce i wszystko wygląda dobrze. Nie mogę zrozumieć, dlaczego odpowiedź XML API będzie powodować te problemy. Jakieś pomysły?

Odpowiedz

47

Odpowiadając na moje własne pytanie tutaj przez wieki.

Istnieje obecnie błąd przetwarzania limitu rozszerzenia XML w środowisku Oracle i Java OpenJDK, który powoduje, że współdzielony licznik trafia w domyślną górną granicę podczas analizowania wielu dokumentów XML.

  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

Chociaż myślałem, że nasza wersja (6b27-1.12.6-1ubuntu0.12.04.4) nie miał wpływu, uruchamiając przykładowy kod podany w raporcie o błędzie OpenJDK rzeczywiście potwierdziliśmy, że jesteśmy podatni na błąd.

Aby obejść ten problem, musiałem przekazać pracownikom Storma jdk.xml.entityExpansionLimit=0. Dodając poniższe do storm.yaml w moim klastrze, udało mi się złagodzić ten problem.

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

Należy zauważyć, że to technicznie otwiera cię do ataku Denial of Service, ale ponieważ nasze dokumenty XML pochodzą tylko z SQS, nie martwię się o kogoś kucia złowrogą XML zabijać naszych pracowników.

+0

Może to być coś więcej. Otrzymuję ten sam błąd za pomocą Java6. Nie mam zainstalowanej Java7 w dowolnym miejscu na moim komputerze. – BrianC

+0

P.S. Znakomity Post przy okazji. – BrianC

+0

Nieważne. Znalazło się to również w określonych wersjach Java5, 6, 7 i 8. Zobacz szczegółowe informacje https://bugs.openjdk.java.net/browse/JDK-8028111 – BrianC