skyscreamer / nevado

A JMS driver for Amazon SQS.

Home Page:http://nevado.skyscreamer.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Commons loggers serialized in BytesMessage causing issues during deserialisation

evanherc opened this issue · comments

The BytesMessage and StreamMessage both contain a non-transient _log field. These are serialized to the SQS message (you can verify this by base 64 decoding it). Apart from it being very odd to send a logger across the wire and a waste of resources, it also seems to cause issues when receiving a message.

Hessian throws a fit when it wants to re-instantiate the object with the UnsafeDeserializer. The JavaDeserializer does better but can't seem to create the object due to a crash in the java.util (which I believe might be actually one of the recent security fixes in the latest java releases - running 1.6.0_45)

See for example
Jun 19, 2013 3:58:54 PM org.skyscreamer.nevado.jms.connector.AbstractSQSConnector receiveMessage
INFO: Received message 4da1c0ee-e763-49b3-ae54-3334e4917997
Jun 19, 2013 3:58:54 PM org.skyscreamer.nevado.jms.connector.AbstractSQSConnector deserializeMessage
SEVERE: Unable to deserialized message: org.skyscreamer.nevado.jms.message.NevadoBytesMessage._log: 'org.apache.commons.logging.impl.Jdk14Logger' could not be instantiated
com.caucho.hessian.io.HessianFieldException: org.skyscreamer.nevado.jms.message.NevadoBytesMessage._log: 'org.apache.commons.logging.impl.Jdk14Logger' could not be instantiated
at com.caucho.hessian.io.JavaDeserializer.logDeserializeError(JavaDeserializer.java:748)
at com.caucho.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:477)
at com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:270)
at com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:181)
at com.caucho.hessian.io.Hessian2Input.readObjectInstance(Hessian2Input.java:2188)
at com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2109)
at com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2093)
at org.skyscreamer.nevado.jms.util.SerializeUtil.deserialize(SerializeUtil.java:54)
at org.skyscreamer.nevado.jms.util.SerializeUtil.deserializeFromString(SerializeUtil.java:46)
at org.skyscreamer.nevado.jms.connector.AbstractSQSConnector.deserializeMessage(AbstractSQSConnector.java:281)
at org.skyscreamer.nevado.jms.connector.AbstractSQSConnector.convertSqsMessage(AbstractSQSConnector.java:224)
at org.skyscreamer.nevado.jms.connector.AbstractSQSConnector.receiveMessage(AbstractSQSConnector.java:99)
at org.skyscreamer.nevado.jms.NevadoSession.getUnfilteredMessage(NevadoSession.java:462)
at org.skyscreamer.nevado.jms.NevadoSession.receiveMessage(NevadoSession.java:425)
at org.skyscreamer.nevado.jms.NevadoMessageConsumer.receive(NevadoMessageConsumer.java:83)
at org.skyscreamer.nevado.jms.NevadoMessageConsumer.receive(NevadoMessageConsumer.java:74)
at org.skyscreamer.nevado.jms.NevadoMessageConsumer.receive(NevadoMessageConsumer.java:1)
Caused by: com.caucho.hessian.io.HessianProtocolException: 'org.apache.commons.logging.impl.Jdk14Logger' could not be instantiated
at com.caucho.hessian.io.JavaDeserializer.instantiate(JavaDeserializer.java:342)
at com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:197)
at com.caucho.hessian.io.Hessian2Input.readObjectInstance(Hessian2Input.java:2185)
at com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:1695)
at com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:1679)
at com.caucho.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:473)
... 17 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.caucho.hessian.io.JavaDeserializer.instantiate(JavaDeserializer.java:338)
... 22 more
Caused by: java.lang.NullPointerException
at java.util.Hashtable.get(Hashtable.java:334)
at java.util.logging.LogManager$LoggerContext.findLogger(LogManager.java:466)
at java.util.logging.LogManager.getLogger(LogManager.java:888)
at java.util.logging.LogManager.demandLogger(LogManager.java:376)
at java.util.logging.Logger.demandLogger(Logger.java:290)
at java.util.logging.Logger.getLogger(Logger.java:321)
at org.apache.commons.logging.impl.Jdk14Logger.getLogger(Jdk14Logger.java:152)
at org.apache.commons.logging.impl.Jdk14Logger.(Jdk14Logger.java:53)
... 27 more

Thanks for the catch. I've fixed it in master and will schedule a release in the next week.