1/6用友股份-LE支持服务业务本部技术方案--《审批流邮件无法发送问题两例》建立日期:2013-10-20修改日期:xxxx-xx-xx文档属性:客户文控编号:LE-DY-JS-2013-01292/6文档控制创建记录适用范围审阅人日期审阅签字所属部门发布范围发布人姓名所属部门发布时间内部员工伙伴客户日期作者所属部门邮件地址版本2013-10-20魏享林技术支持部V1.0版本领域模块备注3/6目录审批流邮件无法发送问题........................................................................................4问题一:....................................................................................................................4(一问题现象...............................................................................................4)(二解决过程...............................................................................................4)(三解决方案...............................................................................................5)问题二:....................................................................................................................5(一问题现象...............................................................................................5)(二解决过程...............................................................................................5)(三解决方案...............................................................................................6)4/6审批流邮件无法发送问题两例问题一:问题现象(一)审批流邮件经常不能发送,重启中间件后能正常一段时间,过一段时间后就都不能发送。解决过程(二)(1)在发送邮件处代码打桩,输出线程堆栈,好从日志中查看是否调用到了发送邮件代码,以判断是发送邮件的代码出了问题,还是根本就没有调用到发送邮件代码。补丁打到用户环境后,发现不能发送邮件时,根本没有调用到发送邮件代码,说明同发送邮件代码无关。(2)检查发送邮件成功的线程堆栈,发现发送邮件是由后台任务调用的。在添加后台任务代码处打桩,查看打桩日志,发现每次发送邮件时,都是向后台添加了发送邮件任务的。(3)怀疑是后台任务出了问题,用NMC查看服务线程,发现有三个服务线程都堵在应用服务器同邮件服务器的网络连接上,网络连接被Hang住了。(4)向顾问询问邮件服务器与应用服务器之间的网络情况,顾问反映NC邮件采用的是126的外部邮箱。(5)检查ierp\bin\scheduleengine.xml,发现配置的后台线程个数为3个,向顾问询问是否发送不了邮件时,预警等后台任务都跑不了,顾问反映是这5/6样。至此找到问题原因:由于126的邮箱不稳定,会造成应用服务器与邮件服务器之间网络连接偶尔被Hang住,如果Hang住的次数达到3次时,会造成后台线程用完,即没有后台线程来发送新的邮件,也没有后台线程来运行预警,导致后续的邮件都发送不了。(6)让用户使用自己内部的邮件服务器,并将ierp\bin\scheduleengine.xml中配置的后台线程数调到10,经过一段时间的测试,发送邮件问题得到解决。解决方案(三)用户使用的外部邮箱不稳定,应用服务器与邮件服务器之间网络连接偶尔会Hang住,导致后台线程被用完,没有新线程来处理邮件发送任务。让用户使用公司内部的邮件服务器即能解决问题。问题二:问题现象(一)NC版本为57,顾问反映,部分公司审批流邮件无法发送,部分公司没有问题,重启中间件也解决不了问题。解决过程(二)(1)在添加邮件发送任务处打桩,输出线程堆栈,以区分是邮件发送代码有问题还是其他模块有问题,分析打桩日志,发现代码没有走到添加邮件发送任务处,说明同邮件发送代码及后台任务调度无关,是其他模块有问题。6/6(2)后台报错信息中,提示单据模板不存在,让顾问检查审批流对应的单据模板和打印模块,发现都是存在的。(3)找到一个发送邮件成功的日志,从线程堆栈中找到邮件发送的发起代码,从发起代码开始,一步步打桩,最后找到代码中的Bug程序判断邮件发送方式的逻辑是:先取整个审批流上定义的邮件发送方式,再取某一具体环节上定义的邮件发送方式,如果环节上定义了邮件发送方式,则以环节上定义的为准,否则以审批流上定义的为准。程序此处存在的漏洞是,某些情况下,环节上定义的邮件发送方式为null,即取得的MailModal为null,导致出现空指针错误,使邮件发送不了。(4)修改代码,在从环节处取得的MailModal为null时,按审批流上定义的邮件发送方式发送邮件,补丁打到用户环境后,邮件发送问题得到解决。解决方案(三)问题出在没有考虑到审批流环节的邮件发送方式对象为null的情况,修改代码,加上对于这种情况的容错处理。补丁:nchome.rar,打此补丁不需要部署EJB,重启中间件即可。