Java 一次只有一个作业实例的最佳方法

Java 一次只有一个作业实例的最佳方法,java,spring,spring-boot,rest,rate-limiting,Java,Spring,Spring Boot,Rest,Rate Limiting,我有一个Spring Rest控制器端点: @PostMapping("/someheavyjob") public Response indexAllReports() { someService.startLongRunningOperation(); return Response.ok().build(); } 然后在服务类中,我有一个方法可以执行许多计算(数据库读取、其他API调用等): 公共运行操作(){ List involvedIds=oth

我有一个Spring Rest控制器端点:

@PostMapping("/someheavyjob")
public Response indexAllReports() {
    someService.startLongRunningOperation();
    return Response.ok().build();
}
然后在服务类中,我有一个方法可以执行许多计算(数据库读取、其他API调用等):

公共运行操作(){
List involvedIds=otherApi.getAllActiveMembersIds(..);
涉及forEach(id->{
另一种计算方法();
});
}
我知道这种方法会阻塞用户的请求,直到完成任务为止。我可以解决它,它处于那种状态只是为了让它清楚。 奎斯顿:我考虑的是:

  • 这个繁重的方法一次只能运行一个实例(方法:StartOngRunningOperation)。 现在,由于这个方法可以从Rest控制器调用,所以每次api调用都会在新线程中启动这个沉重的方法。java中有限制用户请求的机制(例如bucket4j),但我想问你们,处理这种情况的最佳方法是什么?只有一个从RESTAPI调用Spring服务(它是并且应该是无状态的)激发的长时间运行任务的实例
编辑1: 为了清楚起见-阻塞:我的意思是用户必须等待响应单元完成整个任务-这可能需要几分钟。
我想要实现的不是使这个服务方法同步,而是当请求到来时,在这段时间内,这个长时间运行的任务正在工作,然后拒绝第二个请求。

每个api调用都会在新线程中启动这个沉重的方法-我看不到创建了任何线程,并且该方法是同步的。因此,如果有两个rest请求出现,并且第一个请求设法运行长操作(并且在该操作完成之前被阻止),那么第二个线程的预期行为是什么?是否希望它被阻止,并且仅当第一个操作完成时才再次运行此操作?是否要立即返回“服务器正忙,请稍后再试”样式的响应?请澄清以获得最佳答案如果
someService
是单例,您可以将
startongrunningoperation
设置为同步方法。每个Rest API请求在单独的线程中执行-这是Spring的默认行为。到目前为止,没有任何东西阻塞-两个请求-两个线程执行此方法。我想拒绝对此端点的第二次调用(这意味着调用此长时间运行的方法)。服务是单身。使此方法同步是可能的解决方案之一(不拒绝第二次呼叫),还有其他解决方案吗?当然,我想知道。(不要相信我)
public void startLongRunningOperation(){
 List<String> involvedIds = otherApi.getAllActiveMembersIds(..);
 involvedIds.forEach(id -> {
 anotherComputatioMethod();
 });
}