繁体   English   中英

Java:如何每分钟发送 x 封电子邮件

[英]Java : how to send x emails per minute

我需要向 400 个客户发送定制的 email。
我正在这样做:

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

我的问题是我的 email 提供商授权我每分钟只发送 10 封电子邮件。 我怎么能在循环中做到这一点? 谢谢。

使用 Guava 的RateLimiter

如果你的库路径中已经有 Guava,或者你有兴趣添加它,你可以使用这个解决方案:

RateLimiter rateLimiter = RateLimiter.create(10/60d); // 10 permits per 60 seconds.
for (Client c : clients){
  setUpEmail(c);
  rateLimiter.acquire(1);
  sendMail(c);
}

您的问题正是创建RateLimiter的原因。

发送十封邮件后,使用计数器等待一分钟:

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

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

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

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

还有一个更复杂的:

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
  }
}
Deque clientsDeque = new ArrayDeque(clients);
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
Runnable task = () => {
   for (int i=0; i<10; i++){
     Client c = clientsDeque.poll();
     setUpEmail(c);
     sendMail(c);
   }
}
executor.schedule(task, 60, TimeUnit.SECONDS);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM