限制对方法的调用次数

Throttle the number of calls to a method

在我的代码中,我将批量请求发送到自定义数据库。 每个批次的响应时间以毫秒为单位。

但是我对每秒可以发送的批次数量有限制。最多一批。在额外批次的情况下,该批次将被丢弃,这不是所希望的。

我可以使用 Thread.sleep() 一秒钟,这样我就不会以每秒超过一个批次的速度访问数据库。

伪代码如下:

createBatch()
sendBatch()

我想做的是限制每秒调用 sendBatch() 的次数。

我可以使用任何节流库而不是使用 Thread.sleep() 来实现吗?

我认为这是限制一次可以使用的资源数量的问题。尝试使用池化技术。在 java 中,您可以使用 ExecutorService 来做同样的事情。参考 - http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html 这是示例代码

class Worker implements Callable<String> {
private int id;
public Worker(int id) {
    this.id = id;
    System.out.println("im worker = " + id);
}
public String call() throws Exception {
    System.out.println("Started some long operation - " + id);
    Thread.sleep(1000); // only to simulate long running operation
    System.out.println("Fiished long operation - " + id);
    return null;
}

}

// 主要方法

public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) throws ExecutionException, InterruptedException {
    final int poolSize = 100;
    final int workerSize = 1000;
    ExecutorService executor = Executors.newFixedThreadPool(poolSize);
    Future[] futures = new Future[workerSize];
    Worker[] workers = new Worker[workerSize];
    for(int i = 0; i < workerSize; i++){
        workers[i] = new Worker(i);
    }
    System.out.println("finished creating workers================");
    for(int i = 0; i < workerSize; i++){
        futures[i] = executor.submit(workers[i]);
    }
    for (int i = 0; i < workerSize; i++){
        futures[i].get();
    }
    System.out.println("Finished executing all");
    executor.shutdown();
}

}

您可以使用 guava 中的 RateLimiter。
参见:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/RateLimiter.html