簡體   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