在反序列化JMS ObjectMessage时从Log4j获取IllegalStateException



我有一个将日志消息发送到JMS(ActiveMQ(的应用程序,以及一个使用日志消息的进程将其放入数据库。它使用log4j1.x。升级到log4j2后,使用相同版本的ActiveMQ(编译和运行时都是Java8(。我可以在Topic中看到消息,但在使用者的反序列化过程中引发以下异常。类的相同编译版本部署在生产者和使用者上。

请帮忙!

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)
FilteredObjectInputStream是Log4j-api中的一个类。您需要在ActiveMQ类路径中使用它才能在Java8中进行反序列化。在Java 9或更高版本中,您不需要FilteredObjectInputStream,因为Log4jLogEvent将对ObjectInputStream调用setObjectInputFilter来执行相同的安全检查。

请注意,Log4j团队强烈建议不要使用Java序列化。您应该认为它已被弃用,并且可能会在Log4j 3.x 中被删除

发现log4j2在序列化/反序列化方面已更改为与Java9兼容。将运行时环境更改为Java9,它就工作了。

有什么方法可以用Java 8运行它吗?

最新更新