NoClassDefFoundError (初始化失败) - Websphere 和 IBM MQ

2022-09-04 20:29:25

我在基于Spring的Web应用程序上遇到了一个问题,该应用程序正在部署到Websphere并与IBM MQ进行交互。

一切都很好,直到我尝试一些失败测试。

当 Web 应用程序启动并运行时,我停止 IBM MQ。然后,我调用 web 应用程序以发送 JMS 消息。webapp 在调用 JmsTemplate.convertAndSend 时挂起,并且在 ffdc 目录中发现了以下异常。

请注意,JmsTemplate是使用JNDIObjectFactoryBean初始化的,它从Websphere获得了MQ连接工厂设置。

谁能解释一下“初始化失败”背后的原因?

[27/01/11 14:29:39:498 GMT]     FFDC Exception:java.lang.NoClassDefFoundError SourceId:com.ibm.ws.asynchbeans.J2EEContext.run ProbeId:894 Reporter:com.ibm.ws.asynchbeans.J2EEContext@1280128
java.lang.NoClassDefFoundError: com.ibm.msg.client.wmq.common.internal.Reason (initialization failure)
        at java.lang.J9VMInternals.initialize(J9VMInternals.java:140)
        at com.ibm.msg.client.wmq.internal.WMQMessageProducer.checkJmqiCallSuccess(WMQMessageProducer.java:1024)
        at com.ibm.msg.client.wmq.internal.WMQMessageProducer.checkJmqiCallSuccess(WMQMessageProducer.java:997)
        at com.ibm.msg.client.wmq.internal.WMQMessageProducer.access$800(WMQMessageProducer.java:63)
        at com.ibm.msg.client.wmq.internal.WMQMessageProducer$SpiIdentifiedProducerShadow.initialise(WMQMessageProducer.java:758)
        at com.ibm.msg.client.wmq.internal.WMQMessageProducer.<init>(WMQMessageProducer.java:972)
        at com.ibm.msg.client.wmq.internal.WMQSession.createProducer(WMQSession.java:943)
        at com.ibm.msg.client.jms.internal.JmsSessionImpl.createProducer(JmsSessionImpl.java:1162)
        at com.ibm.msg.client.jms.internal.JmsQueueSessionImpl.createSender(JmsQueueSessionImpl.java:131)
        at com.ibm.mq.jms.MQQueueSession.createSender(MQQueueSession.java:148)
        at com.ibm.mq.jms.MQQueueSession.createProducer(MQQueueSession.java:249)
        at com.ibm.ejs.jms.JMSMessageProducerHandle.<init>(JMSMessageProducerHandle.java:132)
        at com.ibm.ejs.jms.JMSSessionHandle.createProducer(JMSSessionHandle.java:1788)
        at org.springframework.jms.core.JmsTemplate.doCreateProducer(JmsTemplate.java:968)
        at org.springframework.jms.core.JmsTemplate.createProducer(JmsTemplate.java:949)
        at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:568)
        at org.springframework.jms.core.JmsTemplate$3.doInJms(JmsTemplate.java:541)
        at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:471)
        at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:539)
        at org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:617)

答案 1

“(初始化失败)”表示类的静态初始值设定项 (“<clinit>”) 方法先前引发了未经检查的异常。发生这种情况时,JVM 会将该类标记为错误,并且随后尝试使用或访问该类会导致 NoClassDefFoundError。在日志中搜索堆栈跟踪中包含“Reason.<clinit>”的错误,以查找根本原因。

(通常,NoClassDefFoundError 应包含“Caused by”,但静态初始值设定项中出现的异常除外,但由于某种原因,原因不存在,或者您没有将其包含在堆栈跟踪中。


答案 2

它看起来确实缺少邮件目录。我正在读取堆栈转储,因为抛出的异常(NoClassDefFound)正在尝试访问其构造函数中的某些内容。缺少的类可能是实际原因,或者丢失的消息可能隐藏了实际的异常,这当然取决于它是如何引发的。你能把一个 catch 块放进去并手动遍历嵌套的异常吗?

即使此异常不是嵌套异常的一部分,也可能意味着它是在未知异常的 catch 块内实例化的。我不会期望在IBM的MQ代码中出现这个问题,但你永远不会知道。


推荐