前公司OA生产事故分析

现象 17:27分OA重启服务器之后,系统日志显示重启完成,前台少部分页面可以打开,大部分页 面打不开或报错。后台日志显示It cannot be assigned to jsonProcDefKeys。如下错误:  分析。 a. 日志信息中的报错原因在于jsonProcDefKeys为NULL。jsonProcDefKeys是在FormManagement中进行定义的,且在static块中进行初始化。判断static块初始化未执行,或未执行完成。 b. FormManagement进行初始化的情况。FormManagement的初始化时在web容器加载成功之后,另起线程掉用FormManagement的空得静态方法来执行static块内容,进行初始化的。 c. 即使在web容器加载成功之后并没有调用的FormManagement的静态方法init进行初始化。在用户访问时,只要引用的地方调用到FormManagement的静态变量或静态方法,还是执行static块进行初始化的,因此可以排除FormManagement未执行static进行初始化。于是判断是static块未被执行完成 d. 之前步骤的分析没有考虑邮件服务的问题,虽然知道邮件服务也有问题,但一直认为邮件系统是即使有问题也是会报错的,为考虑的假死的状况。在明确邮件服务假死之后,查看重启之后thread dump日志,发现大量的线程(86个)由于邮件服务假死而一直runnable状态,但被锁定在邮件服务区域。 e. 由于d步骤的分析,认为大量线程处于阻塞,且邮件服务假死会导致大量IO资源被占用。同时jsonProcDefKeys的初始化过程会需要使用大量IO资源,这样回导致jsonProcDefKeys的初始化速度太慢,而一直未执行完成。因此会导致前台页面或jsonProcDefKeys会因为空而报错。但这个原因无法被证明,于是在thread dump日志中查找FormManagement的信息。 f. FormManagement在thread dump日志中的信息如下: g. 从thread dump中可以清晰的看出FormManagement在已经在执行static块中的初始化方法。但是由于static块中会使用SystemManagement.healthCheck()方法执行同步发邮件操作,导致线程被锁死在邮件服务区域,未完成初始化。 h. 查看thread dump中的http线程可以发现,有376个的http线程在代码层面已经开始执行(Runnable),但是线程缺是等待状态(Object.wait())。查看打印出的方法为StartProcAction.preStartProc(StartProcAction.java:165),WaitProcessDto.getProcTitleTaskUrl(WaitProcessDto.java:449),这两个方法的具体行数都是调用FormManagement的静态方法或静态变量。但是由于FormManagement的static块都未执行完毕,所以FormManagement不能返回值,因此这些线程都处于等待状态,从而导致不能响应前台。http线程处于等待状态示例: 结论 分析中在第g点从thread dump日志的已经分析出是因为邮件服务的假死导致FormManagement中static未执行完,从而导致jsonProcDefKeys的值获取不到。而第h点则验证了这一分析:由于FormManagement未初始化完成,导致所有调用FormManagement的http线程都因为获取不到返回值而在执行后处于等待状态。

2016-05-16 01:58 · 1 min · 江波·林沂

随笔 201604042

好久不在写文章了,可能已经忘记了怎么好好的写文章了。想想当年,高考的时候可以轻轻松松的写千字以上的文章,大一的时候也同样可以简单的思念写到几万字至上。回忆也只能到这里为止了,大二之后好像就只有几百,几千的写代码,再次写几千字的文章也只有老师让交论文的时候。不过这时,文章只不过是应付差事而已,基本上就是在网上左抄抄,右抄抄而已。碰上不严格的老师,就是整个文章文章的下载;其他吗,认真点基本就是通过谷歌英文转中文。 现在想想,还真是怀念当初高考前的日子,至少不用为未来的目标而烦恼。每天就是简单的复习复习在复习,为了高考而努力。 生活总是在不知不觉之中过了许久。不就之前还在期望着大学美好的生活,现在却已经离开了大学校园半年多了;曾经以为离现在的公司好远,却已经在里面工作1年多了。有时我们以为我们还在看路边的风景,却在不知不觉中已经过了目的地。生活越往前,却越觉得孤单。在没有工作的日子里,越来越找不到自己,只能在肥皂剧中消磨自己的时间。

2016-04-04 02:31 · 1 min · 江波·林沂

四个月程序员生涯的一点总结

与产品经理(PD)沟通的技巧 需求永远是无限的,PD的欲望也总是得陇望蜀的,无穷无尽的,如果要满足PD的一切要求是不可能的。 对于无法解决或在预想时间内难以完成的需求(即根据第一条意见据理力争后仍无法退掉的需求),可以放在最后予以解决并可在开发过程中不断向PD反馈无法实现的原因和理由,一般来说这种需求最后要么是PD在你的不间断的骚扰下主动去除掉,要么此需求会在业务方梳理清业务逻辑之后自然消失;只有最糟糕的一种情况才是改需求仍然存在,不过工期一般会被延长的。 作为程序员这几个月的教训 每个公司的代码库本地构建都是有其独特性的。正常来说,在没有代码构建文档或之前公司员工的帮助,本地构建都是艰难的;即使有以上的帮助,本地构建一般来说仍是相当艰难的,因此要做好相应的心理准备。 编写代码之前的业务逻辑准备,算法准备以及对可能影响到得代码的预判远比真正的编写代码重要。如果必要,这些准备是要进行认真备份的。 对自己代码的注释一定要认真,切不可得过且过。因为说不定过不了多久在你已经忘掉了代码实现逻辑时候却要重新根据这段代码进行新程序的接入。 对于别人代码的修改一定要慎重,慎重,慎重。重要的事情说三遍。在未完全搞明白可能影响到的所有代码情况下,任何代码的修改都可能造成重大的bug。 需求的实现时间永远比预期的长,特别是这个需求特别紧急的情况下。你越不想发生的事同时越会发生。

2015-10-31 01:55 · 1 min · 江波·林沂

春雨连绵惹人醉 夏雨凌然使人晦 秋雨绵绵惹人恨 冬雨飘飘让人追

2012-08-21 02:09 · 1 min · 江波·林沂

春日小感

头晕眼花耳聋 孤独落寞凄凉 爱乎恨乎得乎哉

2012-04-12 02:15 · 1 min · 江波·林沂