Лучший способ ограничить параллельный запрос в методе @RestController

Учитывая следующий код:

@RestController
@RequestMapping("/requestLimit")
public class TestController {

    @Autowired
    private TestService service;

    @GetMapping("/max3")
    public String max3requests() {
        return service.call();
    }
}

@Service
public class TestService {

    public String call() {
        //some business logic here
        return response;
    }
}

Я хочу добиться того, чтобы если метод call из TestService выполняется 3 потоками одновременно, следующее выполнение генерирует ответ с кодом HttpStatus.TOO_MANY_REQUESTS.

Вы должны сохранить атомарную переменную и увеличивать ее в своем классе контроллера. Увеличьте его в своем методе и проверьте, превышает ли оно 3, и если да, вернитесь, иначе продолжайте

pvpkiran 30.08.2018 16:03

Спасибо @pvpkiran, с вашей рекомендацией мне удалось предложить ответ

Julio Villane 30.08.2018 16:40

Используйте Semaphore, предназначенный для этого.

M. Deinum 30.08.2018 21:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
3
93
1

Ответы 1

Благодаря комментарию @pvpkiran мне удалось закодировать это:

@RestController
@RequestMapping("/requestLimit")
public class TestController {

    private final AtomicInteger counter = new AtomicInteger(0);

    @Autowired
    private TestService service;

    @GetMapping("/max3")
    public String max3requests() {
        while(true) {
            int existingValue = counter.get();
            if (existingValue >= 3){
                throw new TestExceedRequestLimitException();
            }
            int newValue = existingValue + 1;
            if (counter.compareAndSet(existingValue, newValue)) {
                return service.call();
            }
        }
    }
}

@Service
public class TestService {

    public String call() {
        //some business logic here
        return response;
    }
}

С соответствующим определением исключения:

@ResponseStatus(HttpStatus.TOO_MANY_REQUESTS)
public class TestExceedRequestLimitException extends RuntimeException{ }

Другие вопросы по теме

Похожие вопросы

Лучший способ ограничить время выполнения в @RestController
Баланс нагрузки с Spring-Cloud-gateway показывает откат, когда некоторые службы останавливаются / завершаются в течение длительного времени
Два разных хэш-кода для объекта, созданного с помощью Spring Boot в одном контексте
Параллельные соединения Webflux каким-то образом ограничены 256
Ошибка повторяющегося ключа при попытке обновить поле объекта в MongoDB SpringBoot
Можно ли использовать OSGI с микросервисами весенней загрузки? Расскажи пожалуйста поподробнее
Как: Gradle Build Spring Boot app с внешним файлом конфигурации
Отклонение перекрестного происхождения отклонено: политика одного источника запрещает чтение удаленных ресурсов (причина: запрос CORS не был успешным)
Страница результатов не открывается после нажатия кнопки отправки в Spring Boot
Остановить Spring Cloud Stream @StreamListener от прослушивания до получения какого-либо Spring Event