java - delete - Qué causa estas excepciones de ParseError al leer de una cola de AWS SQS en mi clúster de Tormenta
amazonsqsclientbuilder (1)
Respondiendo mi propia pregunta aquí por las edades.
Actualmente existe un error de procesamiento de límite de expansión XML en Oracle y Java de OpenJDK que da como resultado un contador compartido que golpea el límite superior predeterminado al analizar múltiples documentos XML.
- https://blogs.oracle.com/joew/entry/jdk_7u45_aws_issue_123
- https://bugs.openjdk.java.net/browse/JDK-8028111
- https://github.com/aws/aws-sdk-java/issues/123
Aunque pensé que nuestra versión (6b27-1.12.6-1ubuntu0.12.04.4) no se vio afectada, al ejecutar el código de ejemplo proporcionado en el informe de error OpenJDK verificamos que éramos susceptibles al error.
Para jdk.xml.entityExpansionLimit=0
el problema, necesitaba pasar jdk.xml.entityExpansionLimit=0
a los trabajadores de Storm. Al agregar lo siguiente a storm.yaml
en mi clúster, pude mitigar este problema.
supervisor.childopts: "-Djdk.xml.entityExpansionLimit=0"
worker.childopts: "-Djdk.xml.entityExpansionLimit=0"
Debo señalar que esto te abre técnicamente a un ataque de Denegación de Servicio, pero como nuestros documentos XML solo provienen de SQS, no me preocupa que alguien falsifique XML malévolo para matar a nuestros trabajadores.
Estoy usando Storm 0.8.1 para leer los mensajes entrantes de una cola de Amazon SQS y obtengo excepciones consistentes al hacerlo:
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
He depurado los datos en la cola y todo se ve bien. No puedo entender por qué la respuesta XML de la API estaría causando estos problemas. ¿Algunas ideas?