线上一个类加载的问题(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。以上那个类是考虑遗留。(偏的逻辑,测试没有顾虑到)
四、思考
在处理线上这样紧急的故障的时候,一般有以下几步:(当然是交替做的)
第一,确认影响范围,平息影响。
第二,找出原因,快速解决(如果有短期修改方案,那就采取短期方案)(能找牛人解决,那就快点找,不要耽误修复最佳时间
第三,完全解决。
不过,啥事情都是未雨绸缪的好,但是也不保证没有紧急情况产生。
五、版权申明

此文可以自由转载,请保留 著作者相关信息。

作者:就职于 阿里巴巴 封神


展开阅读全文

没有更多推荐了,返回首页