【问题标题】:Unable to exclude jboss log4j logmanager module on EAP 6.4.2无法在 EAP 6.4.2 上排除 jboss log4j logmanager 模块
【发布时间】: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。

【问题讨论】:

标签: logging jboss log4j


【解决方案1】:

原来问题出在使用容器管理的 mq 连接工厂。 这就是应用程序读取消息的方式

app -> MDB -> jndi -> connection factory -> mq resource adapter jar -> bound to jboss-log4j

mq 资源适配器绑定到 jboss-log4j jar。因此,当我尝试从主题中读取对象消息时,它使用 jboss-log4j jar 而不是应用程序提供的 log4j。

我通过删除对容器提供的资源适配器的依赖并删除 JNDI 查找来解决此问题。将 MDB 替换为 spring jms 侦听器,该侦听器可以处理打包在我耳内的 mq jar。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多