web-dev-qa-db-ja.com

NoClassDefFoundError(初期化の失敗)-WebsphereおよびIBM MQ

Websphereにデプロイされ、IBMMQと対話するSpringベースのWebアプリケーションで問題が発生しています。

いくつかの失敗テストを試すまでは、すべて問題ありません。

Webappが稼働している間、IBMMQを停止します。次に、webappを呼び出してJMSメッセージを送信します。 JmsTemplate.convertAndSendの呼び出しでwebappがハングし、ffdcディレクトリで次の例外が見つかりました。

JmsTemplateは、WebsphereからMQ ConnectionFactory設定を取得したJNDIObjectFactoryBeanを使用して初期化されたことに注意してください。

「初期化の失敗」の背後にある理由を誰かが説明できますか?

[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)
11
Alex

「(初期化失敗)」は、クラスの静的初期化子( "<clinit>")メソッドが以前にチェックされていない例外をスローしたことを意味します。これが発生すると、JVMはクラスを不良としてマークし、その後クラスを使用またはアクセスしようとすると、NoClassDefFoundErrorが発生します。スタックトレースに「Reason。<clinit>」を含むエラーがないかログを検索して、根本的な原因を見つけます。

(通常、静的初期化子で発生した例外を除いて、NoClassDefFoundErrorには「Causedby」を含める必要がありますが、何らかの理由で、原因が存在しないか、スタックトレースに含めていません。)

14
Brett Kail

メッセージカタログが欠落しているように見えます。スローされた例外(NoClassDefFound)がコンストラクター内の何かにアクセスしようとしているため、スタックダンプを読み取っています。もちろん、スローされた方法に応じて、欠落しているクラスが実際の原因であるか、欠落しているメッセージが実際の例外を隠している可能性があります。キャッチブロックを挿入して、ネストされた例外を手動でウォークできますか?

この例外がネストされた例外の一部ではない場合でも、不明な例外のcatchブロック内でインスタンス化されたことを意味する場合もあります。私はIBMのMQコードでその問題を予期していませんが、あなたは決して知りません。

0
Kelly S. French