Лимиты api запросов в секунду tomcat

схожие вопросы есть уже здесь, но не нашел ответа на свой, так как есть небольшой нюанс. У меня есть Tomcat сервер, он принимает хуки (насколько я прочитал, каждый хук запускается по сути отдельным потоком) после принятия хука, он отправляет запрос на некий другой сервер, где ограничение запросов в секунду от одного приложения 7, иначе блокировка апи. Из за того что каждый хук запускается отдельным потоком, я не могу использовать глобальную переменную чтобы подсчитывать и контролировать после запросы на сервер с лимитом. Получается теоретически у меня есть риск если придёт 500 хуков за раз, то отправится паралельно 500 запросов на сервер, что явно выше чем лимит в 7 запросов в секунду.

Вопрос: как мне реализовать чтобы моё приложение или сделало очередь с пропускной способностью максимум 6-7 запросов в секунду, или отправляло на конкретный сервер с лимитом максимум 7 запросов также используя очередь.

Варианты которые я перебирал: использовать например mysql и чтобы каждый запрос сначала туда добавлять, а после добавления, смотреть какой в таблице этот запрос в списке, и ставить нужную задержку, после выполнения удалять себя из mysql списка очереди, но тут боюсь что в промежутке добавил - промежуток - посмотрел какой в списке, еще могут добавляться другие запросы что полностью уничтожит эту затею, тоесть, программа добавит себя в список, после во время пока программа отправляет запрос к БД чтобы узнать себя в очереди, другие запросы могут себя туда записать и т. д. В общем я новичек сильно в этой теме, пока решения самостоятельно не придумал, подскажите какие варианты есть или в какой теме копать? код пишу на java.

Обновлено: Нашел пока решение которое тестирую, добавить переменную в клас который запускает томкат, и метод synchronized который её редактирует, тем самым хоть и запускаются разные потоки на каждый запрос, эта переменная общая, и сохраняет своё значение после прошлого потока, попробую реализовать лимит так, если получиться отпишусь

Обновлено: спустя еще часов 5 изучения, сделал всё таки через переменные статик и просто через переменную класса, ,в принципе теоретически вопрос решается, но выходит другая проблема, а именно, сервер когда мне присылает 50 хуков за раз, получается он ждет в очереди из аз того что у меня каждый запрос встаёт в очередь, из этого выходит пока косвенно так что сервер который отправлял вебхук, думает что вебхук не дошел, и потом снова повторно его отправляет :( а это дубликат по сути


Ответы (1 шт):

Автор решения: Анатолий

В общем не нашел другого решения пока, как сделать статик переменную, оказалось она действует на всём томкате, соответственно, сделал клас, метод которого я просто вызываю там где надо пробросить лимит на выполнение в секунду, в данном случае сделал лимит "не больше 1 запроса в пол секунды (указал в наносекундах), также на приёме хуков в методе doPost я ставлю статус 200 и закрываю response.getInputStream().close(); по итогу сервер который прислал хук, в очереди не висит, а сразу получает ответ, а я себе обрабатываю дальше всё спокойно раз в пол секунды каждый запрос, если пришло много за раз.

вот клас в котором реализовал чтобы не больше 1 запроса в пол секунды было.

private static volatile LocalDateTime localDateTime;

public LimitRequestToAmocrm() {
    if(localDateTime == null){
        localDateTime = LocalDateTime.now();
    }
}


public void sleep(){
    while (LocalDateTime.now().isBefore(localDateTime.plusNanos(500000000))){
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
    localDateTime = LocalDateTime.now();
}
→ Ссылка