ConcurrentLinkedQueue和spring taskExecutor多线程发邮件问题

banditgao 2015-01-23 02:44:40
客户业务欠费需要发邮件给它,明明只需要发1次的邮件,发了一堆,主要使用了 ConcurrentLinkedQueue 和spring taskExecutor 还有 javamail 启了5个线程来发,请各位帮忙看看谢谢!!


2分钟一次的定时器代码如下:


//SendMailForRealTimeAction.java

@Component("sendMailForRealTimeAction")
public class SendMailForRealTimeAction
{
private static final Logger logger = Logger.getLogger("MAIL");

@Resource
private TaskExecutor taskExecutor;

@Resource
private SendMailForRealTimeService sendMailForRealTimeService;

private Queue<Long> queueOfOpen = new ConcurrentLinkedQueue<Long>();

//入口
public void sendMail()
{

try
{

List<Long> list = sendMailForRealTimeService.getIdsOfSendMailForOpen();

if (null != list)
{

for (Long id : list)
{
queueOfOpen.offer(id);
}

for (int i = 0; i < Constants.SEND_MAIL_NUMBER_OF_THREADS; i++)
{
taskExecutor.execute(new SendMailThreadForOpen(queueOfOpen));
}
}
}
catch (Exception e)
{
......
}
}

//线程类(在类内部)
class SendMailThreadForOpen implements Runnable
{

private Queue<Long> queue;

public SendMailThreadForOpen(Queue<Long> queue) {
this.queue = queue;
}

public void run()
{
sendMailForRealTimeService.sendMailForOpen(queue);
}
}


}


//具体发送类

//SendMailForRealTimeServiceImpl.java

public void sendMailForOpen(Queue<Long> queue)
{

OpenMailInfo openMailInfo = null;

while (true)
{

if (!queue.isEmpty())
{

Long id = queue.poll();

if (null != id)
{
Long success = null;

try
{
//...拼接邮件内容,具体略过

// 执行邮件发送
javaMailSender.send(msg);

}
else
{
break;
}
}
}



日志如下:

Line 2097: MAIL:<INFO>:2015-01-19 07:07:41,701[taskExecutor-198]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com
Line 2245: MAIL:<INFO>:2015-01-19 07:07:49,135[taskExecutor-198]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com
Line 2393: MAIL:<INFO>:2015-01-19 07:07:56,454[taskExecutor-198]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com
Line 2400: MAIL:<INFO>:2015-01-19 07:08:00,241[taskExecutor-203]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com
Line 2402: MAIL:<INFO>:2015-01-19 07:08:00,279[taskExecutor-201]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com
Line 2477: MAIL:<INFO>:2015-01-19 07:08:00,856[taskExecutor-199]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com
Line 2553: MAIL:<INFO>:2015-01-19 07:08:04,024[taskExecutor-198]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com
Line 2701: MAIL:<INFO>:2015-01-19 07:08:08,828[taskExecutor-198]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com
Line 2849: MAIL:<INFO>:2015-01-19 07:08:16,261[taskExecutor-198]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com
Line 2997: MAIL:<INFO>:2015-01-19 07:08:23,712[taskExecutor-198]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com
Line 3145: MAIL:<INFO>:2015-01-19 07:08:31,220[taskExecutor-198]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com
Line 3293: MAIL:<INFO>:2015-01-19 07:08:38,667[taskExecutor-198]>>发信成功。标题:【欠费提醒】套餐扣费余额不足 收信人:wei1.jie@net.com


看日志,好像是每个线程都得到一份同样的数据,每条数据都发了好几次,测试也无法重现,求教啊 ,分不够再加!
...全文
173 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
banditgao 2015-01-26
  • 打赏
  • 举报
回复
引用 1 楼 wangxf_8341 的回复:
代码应该没什么问题,你这每次发送时就id不一样,但是日志没有将id打印出来
什么ID?每个用户的ID? taskExecutor-198 这个是不是线程的编号啊?意味着多个线程每个都发了好几封邮件?
淡定的峰哥 2015-01-26
  • 打赏
  • 举报
回复
引用 2 楼 banditgao 的回复:
[quote=引用 1 楼 wangxf_8341 的回复:] 代码应该没什么问题,你这每次发送时就id不一样,但是日志没有将id打印出来
什么ID?每个用户的ID? taskExecutor-198 这个是不是线程的编号啊?意味着多个线程每个都发了好几封邮件?[/quote] 线程池中的线程是复用的,所以线程的id是会重复的,我说的是队列中存放的id是否是重复的,打印出来看看
淡定的峰哥 2015-01-23
  • 打赏
  • 举报
回复
代码应该没什么问题,你这每次发送时就id不一样,但是日志没有将id打印出来

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧