我当前正在实施一个程序,该程序要求我使用Twitter4J收集并存储推文。但是,我确实意识到,使用Twitter的Developer API,您每15分钟只能发出180个请求。

因此,我创建了一种方法,该程序在收到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);
            }
}


我如何更改此设置,以使它在速率限制即将用尽并停止时才用尽,并且仅在补充时才启动。
谢谢你的帮助。

最佳答案

我之前也遇到过同样的问题,因此我尝试计算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);

关于java - 速率限制预防[Twitter4J],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35760269/

10-10 03:03