Java Twitter4j-AsyncTwitter:将TwitterListener中的响应与启动请求相关联

Java Twitter4j-AsyncTwitter:将TwitterListener中的响应与启动请求相关联,java,multithreading,spring-boot,twitter,twitter4j,Java,Multithreading,Spring Boot,Twitter,Twitter4j,我已经实现了一个SpringBootHTTP方法,允许为任何Twitter帐户获取5000个追随者 在后端,首先,我使用 IDs ids = twitter.getFollowersIDs(username, -1); 之后,我将5000个ID分成100个块 然后,我使用AsyncTwitter向Twitter异步发送几个“lookupUsers”HTTP请求,并使用LOCK.wait()暂停线程 然后,使用以下侦听器方法: @Override public void look

我已经实现了一个SpringBootHTTP方法,允许为任何Twitter帐户获取5000个追随者

在后端,首先,我使用

IDs ids = twitter.getFollowersIDs(username, -1);
之后,我将5000个ID分成100个块

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

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

    @Override
    public void lookedupUsers(ResponseList<User> users)
@覆盖
公共void lookedupuser(响应列表用户)
我阅读每个响应并将返回的用户列表添加到类属性“followerAccounts”中

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

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

是否有任何方法可以在lookedupUsers(ResponseList users)方法中获取Twitter HTTP响应的某些头,或者传递以某种方式指示链接到响应的“lookupUsers”请求的参数


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

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


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

在我看来,您所谓的“主线程”实际上是以HTTP请求启动的线程。。。我看不出它怎么能和其他请求混在一起。。。也许我没有正确地理解你。在任何情况下,暂停线程对我来说都不好。