java - Java - 如何在排队其他人时一次发送一定数量的http请求
问题描述
我正在开发一个不和谐机器人,它允许您使用 myanimelist 的 Jihan Rest API 搜索动漫。但是,该 API 每秒只允许 2 个请求,任何违反该请求的行为都将导致 IP 封禁。因此,我必须将搜索功能(它将请求发送到 Jihan API)编程为一次只搜索 2 个东西。然而,这比看起来要复杂得多。
对于那些不知道 Discord API 是如何工作的人来说,有一个被覆盖的 message received 方法,只要包含机器人的服务器上的用户发送消息,就会运行该方法。这个方法也有点像一个线程,因为它的一个单独实例为每个发送消息的用户运行。
这会使程序复杂化,因为如果超过 3 个用户同时搜索动画,我需要以某种方式发送两个请求,同时将第三个请求排队,直到另外两个用户之一返回响应。但是,我还必须将该响应返回给messageReceived
发送它的方法的实例。
我真的没有任何代码可以显示这个。对于如何解决这个问题,我只希望得到解释、伪代码或 java 代码。非常感谢!
解决方案
我不确定我是否完全正确地解决了您的问题,但似乎您可以使用消费者/生产者模式解决这个问题,并在两者之间设置一个阻塞队列。
所以当用户发送消息时,它不会直接进入 Jihan Rest API,而是作为任务提交到阻塞队列。这将是应用程序的生产者部分。
消费者部分将通过获取队列的任务(用户消息)并发送请求来提交到 Jihan Rest API。
通过将 Callables 提交到具有两个线程的有界线程池,您可以确保每秒只提交和返回两个请求。由于 Callable 将阻塞直到它完成,您可以在两者之间计时一秒钟。或者,您可以使用像信号量这样的同步器,这将是一个更好的做法。
推荐阅读
- apache-spark - 通过 API 访问 spark 程序
- entity-framework - MassTransit 实体框架审计存储 SentTime 不可用
- javascript - 在 NgRx (Angular) 的效果中将动作链接在一起
- c - 输入大小写时,切换案例菜单不退出程序
- python - 通过比较同一数据框中的两列来更新列
- roc - roc_curve 指标中的阈值大于 1 是否可以?
- python - IB_insync 为共享返回小整数(1 = 100, 0 = 50?)需要浮点数或适当缩放的整数
- shell - 如何将包含特定数字的目录中的文件移动到不同的目录中?
- python - pip 安装频谱,没有额外内容
- python - 对没有返回值的方法进行单元测试