一个try{}catch位置引发的血案
来源:互联网 发布:淘宝企业店铺入驻费用 编辑:程序博客网 时间:2024/04/30 00:44
多线程是个坑,这话一点不假。最近在使用多线程异步发送邮件的时候就掉坑了。
老代码如下:
private static class SendExecutor extends Thread {
public void run() {
init();
if (null != queue) {
try {
while (true) {
EmailInfo email = queue.poll(300, TimeUnit.SECONDS);
if (null != email) {
if (log.isInfoEnabled()) {
log.info("send email , targetEmail : " + email.getTargetEmail() + " subject : " + email.getSubject());
}
if (log.isDebugEnabled()) {
log.debug("send email , targetEmail : " + email.getTargetEmail() + " subject : " + email.getSubject() + " content "
+ email.getContent());
}
sendMail(email.getContent(), email.getSubject(), email.getTargetEmail());
}
}
} catch (Exception e) {
log.error("", e);
}
}
}
}
queue采用的是LinkedBlockingQueue, 粗略的看,是否没有问题(我也是这样的)。 但代码在生产环境上出现了bug。
客户反应,邮件没有接受到. 看日志,代码也没有发现问题。最后在日志中发现了一个错误日志,才提醒了我问题出现的地方。
问题出现在try{}catch的位置在循环外,因此,如果出现异常,while将跳出,线程将完成,后续就没有消费者执行发送任务。
查看系统日志发现,因为系统中有部分老用户,老用户的邮箱地址不规范,例如,有一个用户的邮箱地址是 “1”,导致在执行sendMail()的时候,出现异常。
修改这个bug其实也很简单,将try{}catch防止在while里面就行,当然,在进入队列之前,检查邮箱是否为合格的邮箱地址很有必要.
修改后的代码如下:
private static class SendExecutor extends Thread {
public void run() {
init();
if (null != queue) {
while (true) {
try {
EmailInfo email = queue.poll(300, TimeUnit.SECONDS);
if (null != email) {
if (log.isInfoEnabled()) {
log.info("send email , targetEmail : " + email.getTargetEmail() + " subject : " + email.getSubject());
}
if (log.isDebugEnabled()) {
log.debug("send email , targetEmail : " + email.getTargetEmail() + " subject : " + email.getSubject() + " content "
+ email.getContent());
}
sendMail(email.getContent(), email.getSubject(), email.getTargetEmail());
}
} catch (Exception e) {
log.error("", e);
}
}
}
}
}
- 一个try{}catch位置引发的血案
- 一个 * 引发的血案
- 一个“-”引发的血案
- 一个"/"引发的血案
- 一个松果引发的血案
- 一个memset引发的血案
- 一个包子引发的血案?
- 一个斜杠引发的血案
- 一个逗号引发的"血案"
- 一个static 引发的“血案”
- 一个分号引发的血案
- 一个key引发的血案
- 一个变量引发的血案
- 一个return引发的血案
- 一个ViewSwitcher引发的血案!
- 一个分号引发的“血案”
- 一个static引发的血案
- 一个2803引发的血案
- 突然 不想 上大学
- 【跟着贺老师做C++项目学习】WEEK1日期结构体
- 云-数据盘的挂载与制作镜像
- 如何得知某段代码的运行时间
- structs笔记
- 一个try{}catch位置引发的血案
- 在实例中学习arm汇编指令
- java的wait方法和notify还有notifyAll方法
- 第四周作业2
- Android应用程序注册广播接收器(registerReceiver)的过程分析
- DLX SPOJ 1771 Yet Another N-Queen Problem (八皇后变形)
- Ubuntu 12.04 Nginx 安装记录
- hdu2424,高精度
- android的窗口机制分析------UI管理系统