我正在尝试使用java在twitter4j之上构建twitter连接器。 Twitte4j没有处理并期望你处理的问题之一是速率限制问题。
我使用Twitter4j充分利用twitter api的方法是在其上构建多个线程。我的tweets id只有推文转储,而我的数据库中有用户id的用户,我需要我的twitter线程来查询twitter并在新信息流入它们时更新这些表。所以,我构建了两个不同的线程,一个更新用户表,一个更新tweets表。用户更新线程相当容易,coz twitter支持一次查询多达100个用户(用户/查找)。但是,推文线程一次只支持一个(推文/节目)。所以,我有我的'tweet update'线程,再启动5个线程,其中每个线程都会查询twitter并一次更新一个帖子。这是速度限制的结果。所以,在任何时候,我都有6个线程在运行并查询TwitterService(我的服务类)。查询之前的这些线程总是检查是否已经命中了ratelimit,如果是,则它们进入睡眠模式。所以线程调用的服务方法如下所示:
private synchronized void checkRateLimitStatus() {
if (rateLimitHit) {
try {
logger.warn("RateLimit has been reached");
wait(secondsUntilReset * 1000);
rateLimitHit = false;
secondsUntilReset = 0;
} catch (InterruptedException ie) {
ie.printStackTrace();
}
notifyAll();
}
}
boolean rateLimitHit由Twitter4J监听器设置,它检查剩余的请求数。计数为零后,此bool设置为true。代码如下所示:
public synchronized void onRateLimitStatus(RateLimitStatusEvent evt) {
RateLimitStatus status = evt.getRateLimitStatus();
if (status.getRemainingHits() == 0) {
rateLimitHit = true;
secondsUntilReset = status.getSecondsUntilReset();
}
}
这个问题就是说,我还有3个查询留给Twitter,方法checkRateLimitStatus()将为所有6个查询返回false(因为它尚未设置)。因此,所有线程开始因为计数尚未为零。但是,当使用Twitter完成前3个线程时,计数将达到零,并且三个线程中的其余线程都会失败。
我该如何解决这个问题?如何使这些线程更可靠?
答案 0 :(得分:1)
假设获得速率限制状态是基于与其他操作相同的Twitter消息传递,那么总是存在一个延迟,使得通过检查此状态失败来提高可靠性。除非您以同步方式运行,否则状态总是有可能过时。我建议你在本地尝试计算速率限制状态,并使所有线程可自行恢复是出错的情况。从CPU时间浪费的角度来看,对于任何可重复的操作,使用等待/通知机制也是一个好点。