我正在使用EAP 6.4.2。我们有一个ear应用程序,它监听通过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
从堆栈中可以看出,jboss' s log4j-jboss-logmanager-1.1.2.Final-redhat-1.jar
jar正在使用,而不是使用我耳中包装的log4j 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>
然而,这种排除无效。有什么建议吗?
修改 正如评论中所建议的那样,提供的解决方案here不起作用。我已经将这些排除项添加到jboss xml中。
答案 0 :(得分:0)
原来问题是使用容器管理的mq连接工厂。 这就是应用程序阅读消息的方式
app -> MDB -> jndi -> connection factory -> mq resource adapter jar -> bound to jboss-log4j
mq资源适配器绑定到jboss-log4j jar。因此,当我尝试从主题中读取对象消息时,它使用jboss-log4j jar而不是应用程序提供的log4j。
我通过删除容器提供的资源适配器上的依赖项并删除JNDI查找来解决这个问题。用一个弹簧jms监听器替换了MDB,这个监听器可以在我耳边打包的mq jar中使用。