0

我有一段代码来发送邮件,在发送邮件之前,我必须用当前登录的用户电子邮件覆盖默认的 smtp 设置,并且在我必须恢复它之后,所以当两个或多个用户尝试时存在并发问题发送邮件,那么如何摆脱这个。

4

3 回答 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 回答