Spring boot 在@RestController方法中限制并行请求的最佳方法

Spring boot 在@RestController方法中限制并行请求的最佳方法,spring-boot,threadpool,spring-restcontroller,Spring Boot,Threadpool,Spring Restcontroller,考虑到以下准则: @RestController @请求映射(“/requestLimit”) 公共类测试控制器{ @自动连线 私人测试服务; @GetMapping(“/max3”) 公共字符串max3requests(){ return service.call(); } } @服务 公共类测试服务{ 公共字符串调用(){ //这里有一些商业逻辑 返回响应; } } 我想实现的是,如果来自TestService的方法调用由3个线程同时执行,下一次执行将生成一个带有HttpStatus的响应

考虑到以下准则:

@RestController
@请求映射(“/requestLimit”)
公共类测试控制器{
@自动连线
私人测试服务;
@GetMapping(“/max3”)
公共字符串max3requests(){
return service.call();
}
}
@服务
公共类测试服务{
公共字符串调用(){
//这里有一些商业逻辑
返回响应;
}
}

我想实现的是,如果来自
TestService
的方法
调用
由3个线程同时执行,下一次执行将生成一个带有
HttpStatus的响应。请求太多了
code。

多亏了@pvpkiran注释,我成功地编写了以下代码:

@RestController
@请求映射(“/requestLimit”)
公共类测试控制器{
私有最终AtomicInteger计数器=新的AtomicInteger(0);
@自动连线
私人测试服务;
@GetMapping(“/max3”)
公共字符串max3requests(){
while(true){
int existingValue=counter.get();
如果(现有值>=3){
抛出新的TestExceedRequestLimitException();
}
int newValue=现有值+1;
if(计数器比较数据集(现有值、新值)){
return service.call();
}
}
}
}
@服务
公共类测试服务{
公共字符串调用(){
//这里有一些商业逻辑
返回响应;
}
}
使用相应的异常定义:

@ResponseStatus(HttpStatus.请求太多)
公共类TestExceedRequestLimitException扩展运行时异常{}

您必须在控制器类中保留一个原子变量和增量。在你的方法中增加它,检查它是否超过3,如果是,则返回else proceedThank@pvpkiran,根据你的建议,我设法提出了一个答案,使用了一个信号量
,它就是为此而设计的。