无法在EAP 6.4.2上排除jboss log4j logmanager模块

时间:2016-01-12 22:00:21

标签: logging jboss log4j

我正在使用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中。

1 个答案:

答案 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中使用。