java中的速率控制

时间:2011-09-08 14:46:43

标签: java performance rate

我正在寻找一个好的解决方案或可能是一个API来解决以下问题:

  • 我的应用程序在循环中执行任务,例如它发送电子邮件等。我需要将消息的平均速率限制为例如每秒100条消息或每分钟1000条消息......

不,我正在寻找完成此任务的算法或API。

4 个答案:

答案 0 :(得分:4)

您可以使用ScheduledExecutorService来安排指定时间段内的任务。

例如,要计划每秒100个任务,您可以说:

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

显然,您需要跟踪已执行的任务数量,并在作业完成后关闭调度程序。

答案 1 :(得分:4)

Token bucket algorithm非常容易实现和使用,但非常强大。您可以在运行时控制吞吐量并将一些请求排入队列以处理窥视。

答案 2 :(得分: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);
}

这将确保任务仅在速率允许的情况下尽可能接近一起执行。

答案 3 :(得分:3)

Guava有一个RateLimiter类,就是这样。