Учитывая следующий код:
@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.
Спасибо @pvpkiran, с вашей рекомендацией мне удалось предложить ответ
Используйте Semaphore, предназначенный для этого.




Благодаря комментарию @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{ }
Вы должны сохранить атомарную переменную и увеличивать ее в своем классе контроллера. Увеличьте его в своем методе и проверьте, превышает ли оно 3, и если да, вернитесь, иначе продолжайте