【发布时间】:2016-01-12 22:00:21
【问题描述】:
我使用的是 EAP 6.4.2。我们有一个耳朵应用程序,它监听通过 IBM mq 主题发布的 log4j LogEvents。
Host APP sends LogggingEvent using log4j jms appender => Topic => myApps mdb
我正在尝试使用 MDB 读取此 LoggingEvent 对象。但是读取 jms 消息(对象消息)会导致 NullPointer:
java.lang.NullPointerException
at org.apache.log4j.spi.LoggingEvent.readObject(LoggingEvent.java:290) ~[log4j-jboss-logmanager-1.1.2.Final-redhat-1.jar!/:1.1.2.Final-redhat-1]
at sun.reflect.GeneratedMethodAccessor26.invoke(Unknown Source) ~[?:?]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_60]
at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_60]
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017) ~[?:1.8.0_60]
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1900) ~[?:1.8.0_60]
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) ~[?:1.8.0_60]
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) ~[?:1.8.0_60]
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) ~[?:1.8.0_60]
at com.ibm.msg.client.jms.internal.JmsObjectMessageImpl.getObjectInternal(JmsObjectMessageImpl.java:390) ~[com.ibm.msg.client.jms.internal.jar:?]
at com.ibm.msg.client.jms.internal.JmsObjectMessageImpl.getObject(JmsObjectMessageImpl.java:318) ~[com.ibm.msg.client.jms.internal.jar:?]
... 73 more
从堆栈中可以清楚地看出,我没有使用包装在我耳中的 log4j jar,而是使用了 jboss 的log4j-jboss-logmanager-1.1.2.Final-redhat-1.jar jar。我尝试使用ear/META-INF/jboss-deployment-structure.xml 排除此问题:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
<deployment>
<exclusions>
<module name="org.slf4j" />
<module name="org.slf4j.impl" />
<module name="org.apache.commons.logging" />
<module name="org.apache.logging.log4j" />
<module name="org.apache.log4j" />
<module name="org.jboss.logging" />
<module name="org.jboss.logging.jul-to-slf4j-stub" />
<module name="org.jboss.logmanager" />
<module name="org.jboss.log4j.logmanager" />
<module name="ch.qos" />
</exclusions>
</deployment>
<sub-deployment name="myapp-listener.jar">
<exclusions>
<module name="org.slf4j" />
<module name="org.slf4j.impl" />
<module name="org.apache.commons.logging" />
<module name="org.apache.logging.log4j" />
<module name="org.apache.log4j" />
<module name="org.jboss.logging" />
<module name="org.jboss.logging.jul-to-slf4j-stub" />
<module name="org.jboss.logmanager" />
<module name="org.jboss.log4j.logmanager" />
<module name="ch.qos" />
</exclusions>
</sub-deployment>
</jboss-deployment-structure>
但是,此排除无效。有什么建议吗?
编辑 正如 cmets 中所建议的,here 提供的解决方案不起作用。我已经将这些排除项添加到 jboss xml。
【问题讨论】:
-
@AlejandroGoñi 不是真的。我已经添加了答案中提到的排除项,但这似乎不起作用。