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

Posted

技术标签:

【中文标题】在 @RestController 方法中限制并行请求的最佳方法【英文标题】:Best way to limit parallel request in a @RestController method 【发布时间】:2019-02-05 12:16:57 【问题描述】:

考虑以下代码:

@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;
    

我想要完成的是,如果 TestService 中的方法 call 同时被 3 个线程执行,则下一次执行会生成带有 HttpStatus.TOO_MANY_REQUESTS 代码的响应。

【问题讨论】:

您必须在控制器类中保留一个原子变量并递增。在你的方法中增加它并检查它是否超过 3,如果是,则返回,否则继续 谢谢@pvpkiran,有了你的推荐,我设法提出了一个答案 使用专为此设计的Semaphore 【参考方案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 方法中限制并行请求的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

在springboot整合thymeleaf模板引擎中@Controller和@RestController不同注解的跳转页面方法

如何在@RestController 中获取用户? [复制]

如何在 ServletAPI(Spring MVC)中限制每个用户的请求

现代浏览器是不是仍然限制并行下载?

如何在 Spring Boot 的 @RestController 注释用于创建请求处理程序的方法中使用带有参数的构造函数

在 Restcontroller 的单元测试期间,我的 Mocking 类不起作用