Spring Boot Rest-Controller 限制多线程

Spring Boot Rest-Controller restrict multithreading

我希望我的 Rest Controller POST 端点只允许一个线程执行该方法,其他每个线程都应获得 429,直到第一个线程完成。

    @ResponseStatus(code = HttpStatus.CREATED)
    @PostMapping(value ="/myApp",consumes="application/json",produces="application/json")
    public Execution execute(@RequestBody ParameterDTO StartDateParameter)  
    {
        if(StartDateParameter.getStartDate()==null) {
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST);
        }else {
            if(Executer.isProcessAlive()) {
                throw new ResponseStatusException(HttpStatus.TOO_MANY_REQUESTS);
            }else {
                return Executer.execute(StartDateParameter);
            }       
        }
    }

当我发送多线程请求时,每个请求都得到 201。所以我认为请求比 isAlive() 方法被检查更早。我怎样才能将其更改为仅处理第一个请求并“阻止”其他请求?

springcontroller的生命周期由容器管理,默认是单例的,也就是说bean启动时只有一个实例,多个线程可以使用。使它成为单线程的唯一方法是使用同步块或通过 Executor 服务处理请求调用。但这违背了使用 spring 框架的全部目的。

Spring 提供了其他方法来确保您的代码线程安全。您可以使用 @Scope 注释来覆盖默认范围。由于您使用的是 RestController,因此您可以使用“请求”范围 (@Scope("request")),它会创建一个新实例来处理您的每个 http 请求。这样做将确保在任何给定时间只有 1 个线程访问您的控制器代码。