gpt4 book ai didi

java - Twitter4j-异步Twitter : Associate the response in the TwitterListener with the initiating request

转载 作者:行者123 更新时间:2023-11-30 02:23:52 27 4
gpt4 key购买 nike

我实现了一个 Spring Boot HTTP 方法,允许为任何 Twitter 帐户获取 5000 个关注者。

在后端,首先,我使用

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

之后,我将 5000 个 id 分成 100 个 block 。

然后,我使用 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 响应的一些 header 或任何传递参数的方法,这些参数以某种方式指示链接到响应的“lookupUsers”请求?

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

最佳答案

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

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

关于java - Twitter4j-异步Twitter : Associate the response in the TwitterListener with the initiating request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46151494/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com