![](/img/trans.png)
[英]Autowired object is null in Rest controller when deployed on JBoss EAP
[英]Camel 2.25.4 runtime error when deployed to JBoss EAP 7
以下運行時錯誤發生在之前部署在 JBoss EAP 6 + JDK 1.8 + Camel 2.18.4 上的 Java 8 項目遷移到 JBoss EAP 7.4 + JDK 11 + Camel 2.25.4 時:
java.lang.LinkageError: loader constraint violation: when resolving field "log" of type org.slf4j.Logger, the class loader 'deployment.XXX.war' @1b683b29 of the current class, org.apache.camel.component.sql.SqlProducer, and the class loader 'org.apache.activemq' @4724f2a0 for the field's defining type, org.apache.camel.impl.DefaultProducer, have different Class objects for type org.slf4j.Logger (org.apache.camel.component.sql.SqlProducer is in unnamed module of loader 'deployment.XXX.war' @1b683b29, parent loader 'app'; org.apache.camel.impl.DefaultProducer is in unnamed module of loader 'org.apache.activemq' @4724f2a0, parent loader 'app')
有一個使用 5.16.4 版本的 ActiveMQ jar 部署的自定義 ActiveMQ 模塊。 Camel JMS 組件用於訪問 ActiveMQ 服務器。 詳細的日志條目:
2022-05-18 15:18:36,700 [EbAn6-1Cfh0bsHM] ERROR DefaultErrorHandler - Failed delivery for (MessageId: ID-XXX-1652886967207-9-7 on ExchangeId: ID-XXX-1652886967207-9-6). Exhausted after delivery attempt: 1 caught: org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[ID-XXX-1652886967207-9-6]
Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId ProcessorId Processor Elapsed (ms)
[route146 ] [route146 ] [jms://BsidPollQueue ] [ 37]
[route146 ] [log585 ] [log ] [ 0]
[route146 ] [setHeader421 ] [setHeader[body] ] [ 0]
[route146 ] [setHeader422 ] [setHeader[controllerId] ] [ 9]
[route146 ] [recipientList192 ] [recipientList[simple{Simple: sql:select c.NATIVE_CONTROLLER_ID, c.IP_ADDR, ct.] [ 0]
Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[ID-XXX-1652886967207-9-6]
at org.apache.activemq//org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1842)
at org.apache.activemq//org.apache.camel.impl.DefaultExchange.setException(DefaultExchange.java:389)
at org.apache.activemq//org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:64)
at org.apache.activemq//org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
at org.apache.activemq//org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
at org.apache.activemq//org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:715)
at org.apache.activemq//org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:638)
at org.apache.activemq//org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:248)
at org.apache.activemq//org.apache.camel.processor.RecipientList.sendToRecipientList(RecipientList.java:173)
at org.apache.activemq//org.apache.camel.processor.RecipientList.process(RecipientList.java:133)
at org.apache.activemq//org.apache.camel.processor.Pipeline.process(Pipeline.java:138)
at org.apache.activemq//org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
at org.apache.activemq//org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
at org.apache.activemq//org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
at org.apache.activemq//org.apache.camel.processor.Pipeline.process(Pipeline.java:138)
at org.apache.activemq//org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
at org.apache.activemq//org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
at org.apache.activemq//org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)
at org.apache.activemq//org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:113)
at org.apache.activemq//org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:719)
at org.apache.activemq//org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:679)
at org.apache.activemq//org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:649)
at org.apache.activemq//org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:317)
at org.apache.activemq//org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:255)
at org.apache.activemq//org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1167)
at org.apache.activemq//org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1159)
at org.apache.activemq//org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1056)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.LinkageError: loader constraint violation: when resolving field "log" of type org.slf4j.Logger, the class loader 'deployment.XXX.war' @1b683b29 of the current class, org.apache.camel.component.sql.SqlProducer, and the class loader 'org.apache.activemq' @4724f2a0 for the field's defining type, org.apache.camel.impl.DefaultProducer, have different Class objects for type org.slf4j.Logger (org.apache.camel.component.sql.SqlProducer is in unnamed module of loader 'deployment.XXX.war' @1b683b29, parent loader 'app'; org.apache.camel.impl.DefaultProducer is in unnamed module of loader 'org.apache.activemq' @4724f2a0, parent loader 'app')
at deployment.XXX.war//org.apache.camel.component.sql.SqlProducer.process(SqlProducer.java:115)
at org.apache.activemq//org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
... 27 more
這看起來像是一個類加載問題,您在多個地方(例如在deployment.XXX.war
和另一個模塊中)有一個包含org.slf4j.Logger
的 jar,並且這些 jar 被同一個應用程序使用。 您需要從這些地方之一刪除該 jar,以便org.slf4j.Logger
僅由應用程序的類加載器加載一次。
一種解決方案是將jboss-deployment-structure.xml
修改(或添加)到您的部署中,並排除部署中的日志子系統和任何子部署,例如:
<?xml version="1.0"?>
<jboss-deployment-structure>
<deployment>
<exclude-subsystems>
<subsystem name="logging"/>
</exclude-subsystems>
</deployment>
<sub-deployment name="test.war">
<exclude-subsystems>
<subsystem name="logging"/>
</exclude-subsystems>
</sub-deployment>
</jboss-deployment-structure>
另一種解決方案是通過設置<add-logging-api-dependencies value="false"/>
來修改 EAP 配置中的日志記錄子系統,以便 EAP 不再將日志記錄 API 添加到所有應用程序,例如:
...
<subsystem xmlns="urn:jboss:domain:logging:8.0">
<add-logging-api-dependencies value="false"/>
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.