Невозможно исключить модуль logmanager jboss log4j на EAP 6.4.2

66
6

Я использую EAP 6.4.2. У нас есть приложение для ушей, которое прислушивается к log4j LogEvents, опубликованным по теме IBM mq.

Host APP sends LogggingEvent using log4j jms appender => Topic => myApps mdb

Я пытаюсь прочитать этот объект LoggingEvent, используя MDB. Однако чтение сообщения 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, упакованного в мое ухо, используется 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>

Однако это исключение не имеет никакого эффекта. Какие-либо предложения?

EDIT Как было предложено в комментариях, предлагаемое здесь решение не работает. Я уже добавил эти исключения в jboss xml.

спросил(а) 2016-01-13T01:00:00+03:00 4 года, 5 месяцев назад
1
Решение
102

Выяснилось, что проблема заключалась в использовании фабрики подключений, управляемой контейнером. Это то, как приложение читает сообщения

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

Адаптер ресурса mq был привязан к jboss-log4j банку. Поэтому, когда я пытаюсь прочитать сообщение об объекте из темы, он использует jboss-log4j jar вместо приложения, представленного log4j.

Я работал над этим, удалив зависимости от контейнера, предоставленного адаптером ресурсов, и удалив JNDI-поиск. Заменил MDB прослушивателем пружины, который работает с mq-банками, упакованными внутри моего уха.

ответил(а) 2016-01-13T21:30:00+03:00 4 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема