如何使用twitter4j构建可靠的多线程twitter api查询应用程序?

时间:2012-06-08 09:23:42

标签: java multithreading twitter twitter4j

我正在尝试使用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个线程时,计数将达到零,并且三个线程中的其余线程都会失败。

我该如何解决这个问题?如何使这些线程更可靠?

1 个答案:

答案 0 :(得分:1)

假设获得速率限制状态是基于与其他操作相同的Twitter消息传递,那么总是存在一个延迟,使得通过检查此状态失败来提高可靠性。除非您以同步方式运行,否则状态总是有可能过时。我建议你在本地尝试计算速率限制状态,并使所有线程可自行恢复是出错的情况。从CPU时间浪费的角度来看,对于任何可重复的操作,使用等待/通知机制也是一个好点。