【问题标题】:Twitter4j - AsyncTwitter: Associate the response in the TwitterListener with the initiating requestTwitter4j - AsyncTwitter:将 TwitterListener 中的响应与发起请求相关联
【发布时间】:2018-02-19 10:43:47
【问题描述】:

我已经实现了一个 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”中。

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

问题在于,当两个外部用户同时调用同一个 Spring HTTP 方法时,无法在任何“lookedupUsers”方法中检查 TwitterListener 所指的两个 HTTP 请求中的哪一个。

有什么办法可以得到例如lookupUsers(ResponseList users) 方法中 Twitter HTTP 响应的某些标头或任何传递参数的方式,这些参数以某种方式指示链接到响应的“lookupUsers”请求?

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

【问题讨论】:

  • 在我看来,你所谓的“主线程”实际上是由 HTTP 请求启动的线程......我不明白它如何与其他请求混合......可能我没听懂你的意思。无论如何,暂停线程对我来说听起来并不好。

标签: java multithreading spring-boot twitter twitter4j


【解决方案1】:

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

仍然可以仅使用全局侦听器来分离每个 http 请求的响应,但它需要大量共享的线程安全状态和非常复杂的逻辑,我认为它不会有效。相反,我建议根本不要使用这个异步 api,并在同步 api 之上提供您自己的实现。为每个 id 块创建一个单独的任务,将其提交到线程池并将期货保存到列表中。然后遍历它们并收集所有结果。与现有实现(AsyncTwitterImplDispatcherImpl)相比,它将为您提供对特定 twitter api 方法的并发级别、异常处理和超时的更多控制,后者为所有 api 提供单个固定线程池(默认情况下只有 1 个线程)方法,吞下所有异常并且不提供任何超时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2017-11-04
    相关资源
    最近更新 更多