2015-08-05 3 views
0

В моем коде я отправляю пакетные запросы в пользовательскую базу данных. Время отклика каждой партии равно миллисекундам.Дросселируйте количество вызовов метода

Однако у меня есть ограничение на количество партий, которые я могу отправлять в секунду. Макс одной партии. В случае дополнительных партий партия будет отброшена, что не является желательным.

Я могу использовать Thread.sleep() в течение секунды, чтобы я никогда не попадал в базу данных с более чем одной периодичностью в секунду.

Псевдокод выглядит следующим образом:

createBatch() 
sendBatch() 

То, что я пытаюсь сделать, это предел, сколько раз sendBatch() вызывается в секунду.

Могу ли я достичь этого, используя любую дроссельную библиотеку, а не используя Thread.sleep()?

+0

Ну, вы посмотрели на любые дросселирующие библиотеки? – Kayaman

+0

Я считал Guava, но не понял, как использовать его в моем сценарии. Также я не спрашиваю о ограничении ресурсов. Я только хочу контролировать количество хитов метода. Предполагается, что этот метод будет последовательно ударяться. Исходя из некоторых критериев, этот метод может занять слишком мало или слишком долгое время. Я хочу убедиться, что существует верхний предел количества обращений к методу за определенный период времени. – sujith

ответ

3

Вы можете использовать RateLimiter из гуавы.
см: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/RateLimiter.html

+0

В настоящее время я делаю это с использованием guava ratelimiter. RateLimiter rateLimiter = RateLimiter.create (1.0); rateLimiter.acquire(); performOperation(); В приведенном выше коде я хочу вызвать метод executeOperation() только один раз в секунду. Однако метод вызывается непрерывно независимо от указанного ограничения. Не могли бы вы рассказать мне, как я могу контролировать количество хитов метода в приведенном выше фрагменте. – sujith

+1

Вам не следует создавать новый RateLimiter для каждого вызова executeOperation(). Вместо этого определите один параметр RateLimiter и используйте его. – Mustafa

+0

Hi Mustafa, Решение работает. Но я хотел бы знать одно. Когда я создал RateLimiter вне метода и использовал его внутри него, передав его как param, он сработал. Однако, когда я определил ratelimiter внутри метода и попытался использовать его в методе непосредственно перед вызовом другого метода, это не сработало. Не могли бы вы рассказать мне, почему это так? – sujith

1

Я думаю, что это проблема ограничения количества ресурсов, которые могут быть использованы за раз. Попробуйте использовать метод объединения. в 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; 
} 

}

// главная mehtod

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(); 
} 

}

+0

Я уже пользуюсь службой-исполнителем для управления количеством потоков. В вышеупомянутом вопросе я фактически пытаюсь контролировать количество раз, когда метод вызывается в определенный период времени. – sujith

Смежные вопросы