您的位置:首页 > 其它

从一个莫名其妙的问题到项目管理

2012-08-14 13:03 246 查看
在项目开始时,我划分了任务,其中一个新人负责日志模块,主要职责是配置日志,提供一个统一的日志获取接口。

在项目中我们实现了一个公司自己的简单mvc框架(我们公司甚至不能用开源的框架)。本来已经相对稳定的框架突然之间出了一个奇怪的问题,每次http请求时,servlet都会做一遍init,servlet执行请求的过程也变得非常奇怪,一个实例变量controllerMetaMap在定义的时候已经初始化了,可在使用时却是null,这是个很匪夷所思的问题。首先,servlet全局只应该有一个而不是每个请求来都初始化,其次,实例变量使用时为空,除非我初始化失败了,可是没有异常。

private static Map<String, ControllerMetaAttr> controllerMetaMap = new HashMap<String, ControllerMetaAttr>();
经过多方调试,我发现一个奇怪的问题,每次请求来都会走进LogManager.getLogger()中,出来的时候,tomcat都会自动对context做reload,难道LogManager更改了web文件,导致了tomcat认为项目变更从而重新初始化context,带着这个疑问,我仔细review了LogManager,发现了一段代码。

static{
...
storeProperties();
...
}

从字面上就能看出来是存了properties文件,再一看,properties文件刚好就在web下面的classes文件夹。

导致上面奇怪问题的原因已经很清楚了,每次请求来,都会去初始化LogManager的静态初始化方法,而每次初始化会修改配置文件,从而导致tomcat重新load上下文,下次请求再来的时候,同样会初始化LogManager,因为整个project都被重新load了。

这个问题带来了很多反思。如何避免类似的问题,第一,对框架或者主要模块的代码所引用的模块应当引起充分的重视,在人员安排上适当注意,第二,不能避免的时候应当经常做code review以提高代码质量,这里是一个code review的check list,可以帮助我们很好的去做codereview。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: