Java:如何每分钟发送X个电子邮件RateLimiter

问题描述 投票:3回答:3

我需要向400个客户发送自定义电子邮件。我正在这样做:

for (Client c : clients){
  setUpEmail(c);
  sendMail(c);
}

我的问题是我的电子邮件提供商授权我每分钟仅发送10封电子邮件。我该如何在循环中做到这一点?谢谢。

java javamail
3个回答
1
投票

使用番石榴的RateLimiter

如果您的库路径中已经包含番石榴,或者您有兴趣添加它,则可以使用以下解决方案:

RateLimiter

您的问题恰恰是创建RateLimiter rateLimiter = RateLimiter.create(10/60d); // 10 permits per 60 seconds. for (Client c : clients){ setUpEmail(c); rateLimiter.acquire(1); sendMail(c); } 的原因。


0
投票

使用计数器,等待十分钟后发送:

RateLimiter

这不理想,因为您可能会浪费一些时间,例如当发送十封邮件需要20秒时,您只能等待40秒才能开始新的批量发送。

另一种选择是在每封邮件之间等待,以使10封邮件的时间至少为60秒:

int counter = 0; 
for (Client c : clients){
  counter++;      
  setUpEmail(c);
  sendMail(c);
  if(counter%10==0){
    Thread.sleep(60*1000); // wait a minute
  }
}

以及更复杂的一个:

for (Client c : clients){     
  setUpEmail(c);
  sendMail(c);
  Thread.sleep(6*1000); // wait 6 seconds
}

0
投票
int counter = 0; 
long start = System.currentTimeMillis();
for (Client c : clients){
  counter++;      
  setUpEmail(c);
  sendMail(c);
  if(counter%10==0){
    long needed = System.currentTimeMillis() - start;  // ms needed for ten mails
    Thread.sleep(60*1000 - needed); // wait rest of the minute
    start = System.currentTimeMillis(); // start of the next bulk
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.