要求
我需要能够通过POST调用触发一个(长时间运行的)作业,并立即返回。
一次只能运行一个线程。
由于该作业很昂贵,如果已经有一个作业正在执行,则不希望所有未来的作业触发任何操作。
代码
@RestController
public class SomeTask {
private SomeService someService;
@Autowired
public SomeTask(SomeService someService) {
this.someService = someService;
}
@Async // requirement 1
@RequestMapping(method = RequestMethod.POST, path = "/triggerJob")
public void triggerJob() {
expensiveLongRunningJob();
}
/**
* Synchronized in order to restrict multiple invocations. // requirement 2
*
*/
private synchronized void expensiveLongRunningJob() {
someService.executedJob();
}
}
问题
通过上述代码,要满足需求1和2。如何最好地满足需求3(即:当新线程由POST调用创建时,如果未能获取锁,则跳过同步方法并立即返回)?