要求
我需要能够通过 POST 调用触发(长时间运行的)作业并立即返回。
一次只有一个线程可以运行作业。
这项工作是一项昂贵的工作,如果一项工作已经在进行中,我希望这项工作的所有未来触发器都不做任何事情。
代码
@RestControllerpublic 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 调用的结果创建的新线程跳过同步方法并在获取锁失败时立即返回)?
叮当猫咪
交互式爱情
相关分类