Multithreading 如何对限制JEE CDI事件停止进行评级;429请求太多”;

Multithreading 如何对限制JEE CDI事件停止进行评级;429请求太多”;,multithreading,jakarta-ee,cdi,Multithreading,Jakarta Ee,Cdi,我正在开发一个JEE应用程序,它使用公共RESTful API从参考站点提取数据 我的应用程序使用异步CDI事件来触发对这些RESTful API的多个调用 我希望成为这些API资源的“有礼貌”和“体贴”的用户,并尝试将我的API调用错开随机数毫秒 按如下方式使用改装和RxJava:- final Flowable<Response<ResponseBody>> apiResponse = service.searchEuropePmc(queryParams); com

我正在开发一个JEE应用程序,它使用公共RESTful API从参考站点提取数据

我的应用程序使用异步CDI事件来触发对这些RESTful API的多个调用

我希望成为这些API资源的“有礼貌”和“体贴”的用户,并尝试将我的API调用错开随机数毫秒 按如下方式使用改装和RxJava:-

final Flowable<Response<ResponseBody>> apiResponse = service.searchEuropePmc(queryParams);
compositeDisposable.add(apiResponse.delaySubscription(randomDelay(), TimeUnit.MILLISECONDS).subscribe(response -> reportResponse(response)));
最终可流动apiResponse=service.searchEuropePmc(queryParams);
add(apiResponse.delaySubscription(randomDelay(),TimeUnit.millides).subscription(response->reportResponse(response));
此方法缓解了问题,但我仍遇到以下错误:-

08:49:53,779 ERROR [stderr] (RxComputationThreadPool-3) <html><body><h1>429 Too Many Requests</h1>
08:49:53,779 ERROR [stderr] (RxComputationThreadPool-3) You've sent too many requests in a given amount of time. Please slow down and try again soon.
08:49:53,779 ERROR [stderr] (RxComputationThreadPool-3) </body></html>
08:49:53779错误[stderr](RxComputationThreadPool-3)429请求过多
08:49:53779错误[stderr](RxComputationThreadPool-3)您在给定的时间内发送了太多请求。请放慢速度,稍后再试。
08:49:53779错误[stderr](RxComputationThreadPool-3)
这是因为我有一个10个EJB的池同时进行这些API调用

如何交错/安排这些并发EJB调用,使我不再收到任何“429太多请求”


使用单线程模型是我唯一的选择吗?

在池中使用1个EJB?这将它减少了10倍…@Kukeltje,这肯定会解决我的问题,但是我正在寻找一个比单线程更优雅的解决方案。我希望我可以使用某种类型的CDI事件编排器和/或调度程序来控制事件消耗率。“我希望我可以使用某种类型的CDI事件编排器和/或调度程序来控制事件消耗率。”这不是在创建“队列”吗?如果使用1ejb会在“生产者”(超时从池中获取bean)处产生问题,并且由于您使用的是JEE,那么您可以使用JMS和您正在创建的一种消费,JMS实际上就是一个真正的队列。大多数JMS消费者都可以配置为具有节流功能。我觉得这件事太复杂了。使用单线程模型就可以了;或者将其全部转移到另一个线程。顺便说一句,您仍然可以使用CDI异步事件,但只能通过
NotificationOptions
(使用Weld的特定设置)将单个线程专用于执行。您还可以利用EJB的
计时器
服务,在一段时间内聚合请求,然后发送一个更大的请求(但不确定它是否适用于您的情况)。