中秋前给用户升级了一次程序,中秋后回来发现邮件发不出去了。
因为程序不是我写的,流程也不熟悉,走了很多弯路。
因为用户在生产环境中,无法进行调试,只好通过代码分析,考虑程序员编程水平的时候到了,因为debug是下等程序员用的武器。
我看了一下升级后的程序,几乎所有模块都做了修改。只好从源头开始,我们程序要把用户的数据同步到本地,发现数据没有同步过来。
同步程序肯定有问题,通过svn的比较,很快发现了问题,
String[] receivers=null;
try {
SendParam sp = new SendParam();
contentId = entry.getKey();
MailContent mc = entry.getValue();
Map list = mailSendService.queryMailTarget(contentId);
if(list!=null){
receivers[0] = list.get("contactno").toString();
receivers[0] 肯定为null,这里肯定不正确。
修改了这个bug,已经是晚上了,让用户继续发送数据,发现邮件还是发不出去。
同步程序调用webservice接口,然后由channelsend把邮件发出去。
同时看了一下webservice接口返回100,程序调用ok。
初步认定是channelsend有问题,因为channelsend 修改很多,经过一晚上和一个上午的排查,认为channelsend一切正常。
同时发现channelsend有个同步队列是生产者和消费者模式。生产者从数据库查到大量的数据,放入队列,但是在消费的时候,发现数据库中缺少收件人的信息,消费者又删除了这个数据。
因为这个数据由webservice负责填充,下午认定肯定是webservice程序出了问题。
经过反复的排查,因为webservice需要处理多次数据,webservice在插入数据时,出现了问题。
sqls[i] = "INSERT INTO "+tables[i]+"(ID,INVITATION_ID,EMAIL,NAME,SEX,TAG1,TAG2,targetid) VALUES(SEQ_CH_CUSTOMER.NEXTVAL,"+invitationId+",?,?,?,?,?,"+targetid+")";
values中的targetid应该放在 ?的前面。
修改了这个bug后,邮件可以正常发送。
通过这个升级发现这样几个问题。
1 产品的问题绝大多数是管理的问题,如果升级前测试充分的话,测试阶段就可以解决了。
2 还是产品管理的问题,节假日前匆忙升级,程序员忙于过节,代码质量难以保证,匆忙升级,容易出错。这个问题 joel on software说过,而且这样事情在启明星辰 sohu blog 网御星云上演过多次。
3 这个是研发管理的问题,出了错误就不要报告正常,这样容易让程序员产生错误的判断,这样的问题,自己写的单元测试不难发现。
阅读(1882) | 评论(0) | 转发(0) |