我有一段代码来发送邮件,在发送邮件之前,我必须用当前登录的用户电子邮件覆盖默认的 smtp 设置,并且在我必须恢复它之后,所以当两个或多个用户尝试时存在并发问题发送邮件,那么如何摆脱这个。
问问题
297 次
3 回答
4
一般来说(因为您没有提供代码):如果多个线程以配置后使用的方式使用单个资源,那么您应该将数据放入一个对象(new MailSendRequest(smtpconfig, message)
'并将这些放入一个队列中。Thread
应该注意不同这个队列并处理MailSendRequests
一个一个绕过并发问题。(在这种特定情况下,无论如何都应该延迟发送邮件,因为一次发送大量邮件被 ISP-s 认为不是一个好的做法。他们通常发送定期发出小批量的邮件。)
于 2012-09-27T12:05:14.307 回答
2
jabal 的解决方案也正是我所建议的。具体来说,我建议您使用SingleThreadExecutor服务。它完全符合 jabal 的建议:您可以对邮件请求进行排队,并且一个线程将按顺序处理它们。
尽管我注意到您正在处理一项具有潜在高延迟问题的任务(将其放在其他地方的队列中的一个很好的理由!)。我建议您确保明确设置超时,以便您知道任务应该花费的最长时间,并使用执行程序的提交方法,以便您可以处理在此过程中遇到的任何潜在错误。
于 2012-09-27T12:23:30.913 回答
1
第一种方式:您需要锁定。这是我要做的:
void sendMail(){
syncronize(smtp){
//alter smtp mail object
smtp.sentMail();
//revert smtp mail object
}
}
当代码执行进入syncronize
阻塞时,它会锁定 smtp 对象,然后无论谁来锁定对象,他们都会等到它被解决。
第二种方式:或使用共享Lock
对象。
Lock lock = new ReentrantLock();
void sendMail(){
lock.lock();
//alter smtp mail object
smtp.sentMail();
//revert smtp mail object
lock.unLock();
}
}
这是一种交易
于 2012-09-27T12:12:24.757 回答