4

次の問題を解決するための適切な解決策またはおそらく API を探しています。

  • 私のアプリケーションはループでタスクを実行します。たとえば、電子メールなどを送信します。メッセージの平均レートを、たとえば 1 秒あたり 100 メッセージまたは最後の 1 分あたり 1000 メッセージに制限する必要があります ...

いいえ、まさにこのタスクを実行するアルゴリズムまたは API を探しています。

4

4 に答える 4

4

ScheduledExecutorServiceを使用して、特定の期間のタスクをスケジュールできます。

たとえば、1 秒あたり 100 のタスクをスケジュールするには、次のように言えます。

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(nThreads);
scheduler.scheduleAtFixedRate(mailSender, 0, 10, TimeUnit.MILLISECONDS);

明らかに、実行したタスクの数を追跡し、ジョブが完了したらスケジューラをオフにする必要があります。

于 2011-09-08T14:48:52.237 に答える
4

トークン バケット アルゴリズムは、実装と使用が非常に簡単ですが、非常に強力です。実行時にスループットを制御し、一部のリクエストをキューに入れてピークを処理できます。

于 2011-09-08T14:49:59.587 に答える
3

私が考えることができる最も簡単な方法は、待機しているメールの数に応じて、各メールの送信タイミングを遅らせることです。

final ScheduledThreadPoolExecutor service = new ScheduledThreadPoolExecutor(1);
int ratePerSecond = ...

public static void execute(Runnable run) {
   int delay = 1000 * service.getQueue().size() / ratePerSecond;
   service.schedule(run, delay, TimeUnit.MILLISECONDS);
}

これにより、タスクがレートが許す限り一緒に実行されるようになります。

于 2011-09-08T15:07:48.397 に答える