線上一個類加載的問題(java.lang.NoClassDefFoundError)

一、背景
    2012年02月下旬,把應用的容器從jboss換成了jetty.
二、故障
     前幾天上午 同學叫我看一個問題,截圖如下:
大致描述爲,線上有3臺服務器,第二臺服務器一直在報警,而且報警條數一直在增加。
情況十分緊急,得馬上、立刻解決。
三、處理過程
第一反應就是  看下此情況影響的業務,發現業務十分偏,是一個打點功能。看了下業務量,今天就發了兩個,爲什麼會一直增加呢。
發現原來這個邏輯是可以定時觸發的。
這個是一個異步發佈的消息,當第一次發送的時候,出現問題,就存在本地了,後來再定時啓動發送。幾乎是每隔10s一次。所以異常數據一直在增多,報警不斷。大致如下所示:


 org.apache.activemq.management.JMSStatsImpl 這個類不存在,後來到eclipse ctrl+shift+T 一看是存在這類的,是在包apache.activemq-5.3.0-patch.jar中。後來我到線上環境,把war打開,看是否存在apache.activemq-5.3.0-patch.jar,是存在的。
那麼我就非常糾結了,此到此是爲什麼呢?
類加載順序?
後來再與另一位同事一起查看。找出了問題的原因。
原來 JMSStatsImpl 依賴於javax.management.j2ee.statistics.Stats,這個是j2ee0.4版本的一個接口類。
maven的配置爲:
               <dependency>
                <groupId>com.alibaba.external</groupId>
                <artifactId>java.j2ee</artifactId>
                <version>1.4</version>
                 <scope>provided</scope>
                 </dependency>
是通過provided沒有引入到jetty容器中。(jetty與jboss是有區別的)
爲什麼前期沒有考慮引入j2ee包,我們是想用到j2ee包的時候,直接應用相關的接口包,如用到接口包jms則直接應用jms的jar。以上那個類是考慮遺留。(偏的邏輯,測試沒有顧慮到)
四、思考
在處理線上這樣緊急的故障的時候,一般有以下幾步:(當然是交替做的)
第一,確認影響範圍,平息影響。
第二,找出原因,快速解決(如果有短期修改方案,那就採取短期方案)(能找牛人解決,那就快點找,不要耽誤修復最佳時間
第三,完全解決。
不過,啥事情都是未雨綢繆的好,但是也不保證沒有緊急情況產生。
五、版權申明

此文可以自由轉載,請保留 著作者相關信息。

作者:就職於 阿里巴巴 封神


發佈了76 篇原創文章 · 獲贊 109 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章