Предотвращение ограничения скорости [Twitter4J]

В настоящее время я реализую программу, которая требует от меня использования Twitter4J для сбора твитов и их хранения. Однако я понимаю, что вы можете делать только 180 запросов каждые 15 минут с API разработчика Twitter.

В связи с этим я создал метод, который останавливает программу после того, как она получает 10 твитов, на 15 минут, пока мои потребительские ключи и ключи доступа сбрасывают ограничение скорости. Тем не менее, иногда предел скорости все же иссякает между получением этих 10 твитов? Итак, что я хочу сделать, так это изменить метод, чтобы он остановился из-за того, что предел скорости скоро закончится.

Например...

if (rate limit = 0){
   stop program until rate limit resets
}

Однако мой метод только что реализует счетчик, и когда этот счетчик достигает 10, он останавливается, что не очень экономично или эффективно. Я думал, что 10 твитов будет достаточно, но, очевидно, нет. Вот мой метод...

public void getRateLimit() throws TwitterException{
        if (count == 10){
            try {
                System.out.println("Rate Limit is about to be exhausted for resource...");
                System.out.println("Please wait for 15 minutes, while it resets...");
                TimeUnit.MINUTES.sleep(15);
                count = 0;
            } catch (InterruptedException e) {
                System.out.println(e);
            }
}

Как я могу изменить это так, чтобы он заканчивался, когда лимит скорости вот-вот закончится и остановился, и запускался только при его пополнении. Спасибо за любую помощь.


person John Lewis    schedule 02.03.2016    source источник


Ответы (1)


Я сталкивался с той же проблемой раньше, и я пытаюсь рассчитать время, затрачиваемое на 1 запрос. Если этот запрос менее 5500 миллисекунд, чем программа ждет, пока он не придет 5500 миллисекунд, и он отлично работает для меня,

Вы можете спросить, почему 5500 миллисекунд, потому что 180 запросов 15 минут составляют 5 секунд на запрос.

Вот код, который я использую, надеюсь, это поможет.

do {
    final long startTime = System.nanoTime();
    result = twitter.search(query);
    statuses = result.getTweets();
    for (Status status : statuses) {
        tweet = new Tweet(status);
        userProfile = new UserProfile(status.getUser());

        imageDownloader.getMedia(tweet.mediaEntities);
        imageDownloader.getProfilePhoto(userProfile.ProfileImageUrl);

        System.out.println(tweet);
        System.out.println(userProfile);
    }
    final long duration = System.nanoTime() - startTime;
    if ((5500 - duration / 1000000) > 0) {
        logger.info("Sleep for " + (6000 - duration / 1000000) + " miliseconds");
        Thread.sleep((5500 - duration / 1000000));
    }
} while ((query = result.nextQuery()) != null);
person kadir    schedule 18.04.2016
comment
Я нашел лучшее решение для этой ситуации, здесь проверьте этот ответ stackoverflow.com/a/45199642/2183174 - person kadir; 20.07.2017