Twitter4j - AsyncTwitter:将TwitterListener中的响应与发起请求相关联

时间:2017-09-11 08:42:28

标签: java multithreading spring-boot twitter twitter4j

我已经实现了一个Spring Boot HTTP方法,允许为任何Twitter帐户提取5000个粉丝。

在后端,首先,我正在使用

检索5000个关注者ID
IDs ids = twitter.getFollowersIDs(username, -1);

之后,我将5000个ID分成100块。

然后,我使用AsyncTwitter以异步方式向Twitter发送几个“lookupUsers”HTTP请求,并使用LOCK.wait()暂停该线程;

然后,使用以下侦听器方法:

    @Override
    public void lookedupUsers(ResponseList<User> users)

我读取每个响应并添加在类属性“followerAccounts”中返回的Users列表。

最后,当我收回所有响应时,我使用LOCK.notify()取消阻塞主线程,并返回“followerAccounts”作为HTTP方法的响应。

问题是,当两个外部用户同时调用相同的spring HTTP方法时,无法在任何“lookingupUsers”方法中的TwitterListener中检查它引用的两个HTTP请求中的哪一个。

有没有办法获得,例如在seeupUsers(ResponseList用户)方法中的Twitter HTTP响应的一些标题或任何方式传递参数,以某种方式指示链接到响应的“lookupUsers”请求?

我不想让我的HTTP方法同步,因为它不会扩展以支持大量的并行请求。

1 个答案:

答案 0 :(得分:2)

不幸的是,twitter async api看起来不够灵活,无法轻松满足您的需求。它的所有方法都不返回任何内容(void),因此无法收集特定http请求的响应(Futures)。事实上,它只为所有api方法提供全局侦听器,而不是为每个方法提供更精细的回调。否则,可以为每个http请求提供单独的回调实例。

仍然可以仅使用全局侦听器来分离每个http请求的响应,但是它需要很多共享的,因此线程安全状态具有相当复杂的逻辑,并且我认为它不会有效。相反,我建议不要使用这个async api,并在sync api之上提供你自己的实现。为每个id组创建一个单独的任务,将其提交给线程池并将future保存到列表中。然后迭代它们并收集所有结果。它将为您提供对特定twitter api方法的并发级别,异常处理和超时的更多控制,而不是现有的实现(AsyncTwitterImplDispatcherImpl),它提供单个固定的线程池(默认情况下只有1个线程) )对于所有api方法,吞下所有异常并且不提供任何超时。