Я занимаюсь разработкой приложения JEE, которое извлекает данные со ссылочных сайтов с использованием общедоступных API RESTful.
Мое приложение использует асинхронные события CDI для запуска нескольких вызовов этих API RESTful.
Я хочу быть "вежливым" и "внимательным" пользователем этих ресурсов API и попытался сместить мои вызовы API на случайное количество миллисекунд
используя Retrofit и RxJava следующим образом: -
final Flowable<Response<ResponseBody>> apiResponse = service.searchEuropePmc(queryParams);
compositeDisposable.add(apiResponse.delaySubscription(randomDelay(), TimeUnit.MILLISECONDS).subscribe(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>
Это связано с тем, что у меня есть пул из 10 EJB, одновременно выполняющих эти вызовы API.
Как я могу распределить / запланировать эти одновременные вызовы EJB таким образом, чтобы я больше не получал "429 Too Many Requests"?
Является ли мой единственный вариант использования однопоточной модели?