首页 > 解决方案 > Java - 如何在排队其他人时一次发送一定数量的http请求

问题描述

我正在开发一个不和谐机器人,它允许您使用 myanimelist 的 Jihan Rest API 搜索动漫。但是,该 API 每秒只允许 2 个请求,任何违反该请求的行为都将导致 IP 封禁。因此,我必须将搜索功能(它将请求发送到 Jihan API)编程为一次只搜​​索 2 个东西。然而,这比看起来要复杂得多。

对于那些不知道 Discord API 是如何工作的人来说,有一个被覆盖的 message received 方法,只要包含机器人的服务器上的用户发送消息,就会运行该方法。这个方法也有点像一个线程,因为它的一个单独实例为每个发送消息的用户运行。

这会使程序复杂化,因为如果超过 3 个用户同时搜索动画,我需要以某种方式发送两个请求,同时将第三个请求排队,直到另外两个用户之一返回响应。但是,我还必须将该响应返回给messageReceived发送它的方法的实例。

在此处输入图像描述

我真的没有任何代码可以显示这个。对于如何解决这个问题,我只希望得到解释、伪代码或 java 代码。非常感谢!

标签: javahttprequestdiscord

解决方案


我不确定我是否完全正确地解决了您的问题,但似乎您可以使用消费者/生产者模式解决这个问题,并在两者之间设置一个阻塞队列。

所以当用户发送消息时,它不会直接进入 Jihan Rest API,而是作为任务提交到阻塞队列。这将是应用程序的生产者部分。

消费者部分将通过获取队列的任务(用户消息)并发送请求来提交到 Jihan Rest API。

通过将 Callables 提交到具有两个线程的有界线程池,您可以确保每秒只提交和返回两个请求。由于 Callable 将阻塞直到它完成,您可以在两者之间计时一秒钟。或者,您可以使用像信号量这样的同步器,这将是一个更好的做法。


推荐阅读