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 个线程访问您的控制器代码。
我希望我的 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 个线程访问您的控制器代码。