Reputation: 47
I have an application that send a log message over to JMS (ActiveMQ) and a process that consumes the log message puts to a database. It worked with log4j 1.x. After upgrading to log4j2, with the same version of ActiveMQ (compiled and runtime both Java 8). I can see the messages in the Topic but during deserialization in the consumer throws the following exception. The same compiled versions of classes are deployed on both producer and consumer.
Please help!
java.lang.IllegalArgumentException: readObject requires a FilteredObjectInputStream or an ObjectInputStream that accepts an ObjectInputFilter
at org.apache.logging.log4j.util.SortedArrayStringMap.readObject(SortedArrayStringMap.java:591)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1185)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2345)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2454)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2378)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2454)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2378)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:508)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:466)
**at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:177)**
at org.apache.activemq.command.ActiveMQObjectMessage.toString(ActiveMQObjectMessage.java:199)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:137)
**at com.abc.common.jms.JMSConsumer.onMessage(JMSConsumer.java:106)**
at org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1021)
at org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:122)
at org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:192)
at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:122)
at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:43)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
Upvotes: 1
Views: 283
Reputation: 9151
FilteredObjectInputStream is a class in Log4j-api. You would need that in your ActiveMQ classpath to be able to deserialize in Java 8. In Java 9 or greater you don't need the FilteredObjectInputStream because Log4jLogEvent will call setObjectInputFilter on the ObjectInputStream to perform the same security checks.
Note that the Log4j team STRONGLY recommends not using Java serialization. You should consider it deprecated and likely to be removed in Log4j 3.x
Upvotes: 1
Reputation: 47
Found out log4j2 has been changed vis-a-vis serialization/deserializtion to be compatible with Java9. Changed the runtime env to be Java9 and it worked.
Is there any way it can be run with Java 8?
Upvotes: 0